{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Block Centers:\n",
      "{'scene': {'name': 'scene1', 'lodsetting': {'lodmax': {'distance': 60, 'name': 'building'}}, 'default_camera': [{'id': '01', 'view_direction': {'x': 0, 'y': 0, 'z': 0}, 'position': {'x': 277, 'y': 449, 'z': 835}, 'pov': 55, 'depth': 50000}], 'children': [{'id': 'iPIw_5IQ', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': -90.0, 'y': 0, 'z': -90.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'NoaTC_3t', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': -90.0, 'y': 0, 'z': -70.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'HJJIodZf', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': -90.0, 'y': 0, 'z': -50.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'mRojYHV_', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': -90.0, 'y': 0, 'z': -30.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'R-GcxD01', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': -90.0, 'y': 0, 'z': -10.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'CjJIJylB', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': -90.0, 'y': 0, 'z': 10.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'CdPGQsxt', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': -90.0, 'y': 0, 'z': 30.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'xgTnYLiu', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': -90.0, 'y': 0, 'z': 50.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'yinixlKq', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': -90.0, 'y': 0, 'z': 70.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'akf0QHwU', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': -90.0, 'y': 0, 'z': 90.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': '4UwSFBx8', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': -70.0, 'y': 0, 'z': -90.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'BZgqfavf', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': -70.0, 'y': 0, 'z': -70.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'I2nP8MJU', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': -70.0, 'y': 0, 'z': -50.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'n9TXVS7W', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': -70.0, 'y': 0, 'z': -30.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'V5O5Vuiv', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': -70.0, 'y': 0, 'z': -10.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'Uis2KK_z', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': -70.0, 'y': 0, 'z': 10.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'TATyTzdE', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': -70.0, 'y': 0, 'z': 30.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'Ku9oURMZ', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': -70.0, 'y': 0, 'z': 50.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': '7ijOsnCS', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': -70.0, 'y': 0, 'z': 70.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'GDG0lcix', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': -70.0, 'y': 0, 'z': 90.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'vj5_WQoy', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': -50.0, 'y': 0, 'z': -90.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'z0U47Pc7', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': -50.0, 'y': 0, 'z': -70.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': '_QBsfT5x', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': -50.0, 'y': 0, 'z': -50.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'hFh01szR', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': -50.0, 'y': 0, 'z': -30.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'edbgni02', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': -50.0, 'y': 0, 'z': -10.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'F7P9LqYT', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': -50.0, 'y': 0, 'z': 10.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'gYnZ_mYL', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': -50.0, 'y': 0, 'z': 30.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': '1o7xymyF', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': -50.0, 'y': 0, 'z': 50.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'gHL4SOn_', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': -50.0, 'y': 0, 'z': 70.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'c1cAHqyv', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': -50.0, 'y': 0, 'z': 90.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'Cmvn5YcM', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': -30.0, 'y': 0, 'z': -90.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'bpHq8Zes', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': -30.0, 'y': 0, 'z': -70.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'CVqsTazV', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': -30.0, 'y': 0, 'z': -50.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'jvucNpAw', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': -30.0, 'y': 0, 'z': -30.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'aJMMmOBJ', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': -30.0, 'y': 0, 'z': -10.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'VJc3yXcL', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': -30.0, 'y': 0, 'z': 10.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': '3u6d6XnI', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': -30.0, 'y': 0, 'z': 30.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'P3OH1PHX', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': -30.0, 'y': 0, 'z': 50.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': '-z7udWsq', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': -30.0, 'y': 0, 'z': 70.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'xprJhI-l', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': -30.0, 'y': 0, 'z': 90.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'f1Nncphz', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': -10.0, 'y': 0, 'z': -90.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'ZcXiS65C', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': -10.0, 'y': 0, 'z': -70.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 's3B8uSh-', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': -10.0, 'y': 0, 'z': -50.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'TCIh2LWM', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': -10.0, 'y': 0, 'z': -30.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'lvM4aIvA', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': -10.0, 'y': 0, 'z': -10.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': '3HtW0Oj5', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': -10.0, 'y': 0, 'z': 10.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'vLCOQx9r', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': -10.0, 'y': 0, 'z': 30.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'AHDpohHB', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': -10.0, 'y': 0, 'z': 50.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'FzeNHiGJ', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': -10.0, 'y': 0, 'z': 70.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'ZMoel_F3', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': -10.0, 'y': 0, 'z': 90.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'y8susPQR', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': 10.0, 'y': 0, 'z': -90.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'qCaUOaZh', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': 10.0, 'y': 0, 'z': -70.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': '_INjVLpJ', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': 10.0, 'y': 0, 'z': -50.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': '-eqp0T-C', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': 10.0, 'y': 0, 'z': -30.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'YUVmHxfo', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': 10.0, 'y': 0, 'z': -10.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'PfiFv508', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': 10.0, 'y': 0, 'z': 10.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'DUUwYeiw', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': 10.0, 'y': 0, 'z': 30.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': '0o8luVIV', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': 10.0, 'y': 0, 'z': 50.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'NO9yPNRm', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': 10.0, 'y': 0, 'z': 70.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'aUoDMCSs', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': 10.0, 'y': 0, 'z': 90.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'fgRLONV4', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': 30.0, 'y': 0, 'z': -90.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'X6Iih4Qx', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': 30.0, 'y': 0, 'z': -70.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': '9GosG8yK', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': 30.0, 'y': 0, 'z': -50.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': '463ASFgp', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': 30.0, 'y': 0, 'z': -30.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'TVfJ_kCo', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': 30.0, 'y': 0, 'z': -10.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'KR3nrDw6', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': 30.0, 'y': 0, 'z': 10.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'MVO71tFw', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': 30.0, 'y': 0, 'z': 30.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'cMk_acyZ', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': 30.0, 'y': 0, 'z': 50.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'tlFZywGy', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': 30.0, 'y': 0, 'z': 70.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': '2PE5vkmo', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': 30.0, 'y': 0, 'z': 90.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'OH4IgL5t', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': 50.0, 'y': 0, 'z': -90.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'UXplbV4W', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': 50.0, 'y': 0, 'z': -70.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'v0Kx8Vgg', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': 50.0, 'y': 0, 'z': -50.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'CsNST7KD', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': 50.0, 'y': 0, 'z': -30.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'CmHSe0hz', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': 50.0, 'y': 0, 'z': -10.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': '0X6EqDiS', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': 50.0, 'y': 0, 'z': 10.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'h3LjXXls', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': 50.0, 'y': 0, 'z': 30.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'IjZouIam', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': 50.0, 'y': 0, 'z': 50.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'duR3A9a_', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': 50.0, 'y': 0, 'z': 70.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'ISzK22Ik', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': 50.0, 'y': 0, 'z': 90.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'nVIUQA2J', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': 70.0, 'y': 0, 'z': -90.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'zyg7SB-T', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': 70.0, 'y': 0, 'z': -70.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'omb1bJlz', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': 70.0, 'y': 0, 'z': -50.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'sTl2J4tS', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': 70.0, 'y': 0, 'z': -30.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'NKOpA9Xo', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': 70.0, 'y': 0, 'z': -10.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'VnkmOOeh', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': 70.0, 'y': 0, 'z': 10.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'vU8X9XXt', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': 70.0, 'y': 0, 'z': 30.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'KUS8uOjK', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': 70.0, 'y': 0, 'z': 50.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'YRGHg_jg', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': 70.0, 'y': 0, 'z': 70.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': '-sb9OQL2', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': 70.0, 'y': 0, 'z': 90.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'ot4Xdmwn', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': 90.0, 'y': 0, 'z': -90.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'uXADjaFf', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': 90.0, 'y': 0, 'z': -70.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'p6KUNlXy', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': 90.0, 'y': 0, 'z': -50.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': '_Hbd29dN', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': 90.0, 'y': 0, 'z': -30.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'lkVHB61p', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': 90.0, 'y': 0, 'z': -10.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 's2xgYl4x', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': 90.0, 'y': 0, 'z': 10.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'FsAr0WC2', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': 90.0, 'y': 0, 'z': 30.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'diLi6zwU', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': 90.0, 'y': 0, 'z': 50.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': '1eYHpRk9', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': 90.0, 'y': 0, 'z': 70.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}, {'id': 'Au7coVGM', 'name': 'lodmax', 'lod': 'lodmax', 'position': {'x': 90.0, 'y': 0, 'z': 90.0}, 'rotation': {'x': 0, 'y': 0, 'z': 0}, 'model_3d': [{'model_url': 'lodmax.obj', 'material_url': 'lodmax.mtl', 'texture_url': '', 'shader_url': ''}], 'children': []}], 'default_background': {'color': '#c2d2eb', 'colorAlpha': 1, 'ambientLight': '0xdddddd', 'sunlight': {'color': '0xdddddd', 'denity': 0.8, 'direction': {'x': 1, 'y': 1, 'z': 2}, 'position': {'x': 1000, 'y': 1000, 'z': 1000}}, 'weather': 'sunny', 'shadow': 'true'}}}\n",
      "生成的JSON文件已保存为testData.json\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAcsAAAEWCAYAAAAJory2AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAABgrElEQVR4nO2dfXxcVZ3/P99MOmnSTJkybUqGFAZCJ02a0MBAtSzVEdEFlidBFEFArda2sgqCK4i7y/oTWVFxlUVAhUUe1N0VRQXlSRkoYlkydOikTTsmdErCpEk7NM2kmSRNcn5/3DvTm8l9mJk7M/c0c96v133NzDn3nu/nfO937rkP555DjDEIBAKBQCDQpsJqAQKBQCAQ8I5oLAUCgUAgMEA0lgKBQCAQGCAaS4FAIBAIDBCNpUAgEAgEBojGUiAQCAQCA0RjmSNE9DARfdNkGbcT0WOF0iTIDSL6CxGdZrUOPYjo/4hoZQHK+RoR/VQn/1NE9IpZO4ryuPl/ENEJRDRCRDazZWWUW0VEO4jouEKWW0hkjTuJqM5qLXMF0VhmQERRIkrKf7IDRPQ0ES3jQNftRMSIaLXVWniFiAJE9FmDdS4CkGCMbZV/txLRs0S0n4hmvXRMRMcS0W+I6BAR7SGiq3LQ82Mi2kVE00T0KZX8G4loLxEdJKKHiKhKkf1dAN/I1pYWjLFvMcY+K9vzyDFUmW95vP0/iKiBiJ6Q999BIgqnfM0Ye5sxVssYmyqw2fUAXmaM7ZU1fICIXpTtR1U0euT8UbkBOzcbI0RkJ6JfyT5nROTPyCci+jYRxeXlLiIiAGCMjQN4CMBXzVVVkEI0lupcxBirBVAPYADAPVaKkf8A1wB4F8B1BuvOOhAW+sz6KGcDgEcVvw8D+B8A6zTWvxfABIClAK4GcF8OV3xvAtgE4I3MDCL6ewC3APggAA+AkwH8m2KV3wH4ABHVZ2mrlPD0/3gUQC+AEwG4AFwrayomn8fMGDoEqWH6isb6vwCwFZK+2wD8ioiWZGnrFQCfBLBXJW89gEsBrAJwKoALZW0pfg7guoyTMEG+MMbEolgARAGcq/h9AYCI4vfDAL6p+P05AN2QGrLfAXAr8lYCeF7OGwDwNTn9dgCPyd/nQfozPQHArqHpfQCSkP40ceV6AD4F4C8Avi/b+aas8T4Af4D0Rz4XwD9A+sMOQzq43K4owwOAQWqI3wawH8BtivxqAD8DcABAF4B/AtCnyHfL+vcB2A3gi4q82wH8L4DHACQAhAF4AdwKYFDW8mHF+scAeBBAP4B35PrYFHV9BdJV1wHZ1vly3h0ApgCMARgB8J8qfrTLfmxQyTtF+jvMSFsAqaH0KtIeBfDv8vevAtgCoFL+vRHAdgDzM8p5BcCnMtJ+DuBbit8fBLA3Y53nAVynERN7APjk75+U91+L/PuzAJ5UibW35fVG5GWNnk+Phv+HXI92Da0eub6Vcl1HFMsYgKi8XgWkE5ceSP+v/wFwrEaZJ8gxVKmSd26qTEWaF8A4AIcibTOADfL3+wD8SpH3bQB/AkAZ5fQB8GekvQpgveL3OgBbMtb5G4D36x3zxJLdIq4sdSCiGgAfh3RAVMs/B8CdAD4G6Sx7D4BfynkOAC8AeAZSY3IKpD+BcvtqAE9C+jN9jDE2oSHlOgC/B/Df8u8LM/LfA+AtAHWQGg0AuEr+7oB0MDwE6azbCanh3EhEl2aUczaAJkgH7n8homY5/V9x5OrnQ5AOzqk6VMja3gRwvLztDfKVU4qLIDUyiyA12M9COkAdD+lW4wOKdX8GYBKSv04D8GFIB39lXXcBWAzgLgAPEhExxm6DdBC6nkm33q7HbJYDmGaM9ankqeEFMMUYiyjS3oR0kAeA70BqTL9ORMsBfAvAJxljY1mUvVIuS1nuUiJyKdK6IF01qPESAL/8/X2Q9v/7Fb9fUtnmffKnU/bRX+Xfqj41qgAn/48tAO4loiuJ6AQtrYyxv8p1roUUh1sgNcIA8EVIV2jvl7UcgHRHQY02AG8xxia1bGWwUl4/oUhTxtBNAE6Vnx2vhdTgXcfkli6LsjNjKPOuh14MCXJANJbqPElEQ5Cuwj4E6aCoxtUAHmKMvcGkZwS3AlhDRB5IDdpextj3GGNjjLEEY+w1xbYLIR0oegB8mmk8V5EPSFcA+Dlj7DCAX2H2rdgYY+wextgkYywpp/2WMfYXxti0bD/AGAvLv7dBOlC8P6Ocf2OMJRljb0L646X+ZB+DdBV0QG5ofqjY5kwASxhj32CMTTDG3gLwEwBXKtbZzBh7Vj7A/C+AJZCuzg5DOnh6iMhJREsBnA/gBsbYIcbYIKQrZmVZexhjP5H99TNIB+Glar5TwQnp6jZbagEczEg7COkEBIyxaUgnIF+EdNV0F5OfheZRduq7Q5GWkDWr8RKO7L+1kBql1O/3Q72x1CJXn3Lz/4D039gM4J8B7CaiEBGdaVDfH0I6ebxN/v15SHdS+mSdtwP4qMazXScKG0OjkE4+74Z09+UfcziZU4uh2owTHb0YEuSAaCzVuZQx5gRQBeB6AC9p9HxzQzpbBgAwxkYg3cY5HsAySH90Ld4L6TnDvxucRX4E0pXWH+TfjwM4P+OZR6/KdjPSiOg9cieDfUR0ENKzu8UZ2yifi4xC+jMCUj2V5Sm/nwjATURDqQXA1zDzYKt8hpQEsF9x8Es17rVyWfMA9CvKegDSFfMsjfKBJrVtNhzAzMbIiBFIB20lC6E4WDLGogBehHTlrXU1kk3Zqe/KA7EDwJDG9i8BWCvHpQ3SXYe/kxuiYwCEctCSq0+5+X/IJ3C3MMZWQoq5EKTGXPXKmIg+D+mK/Cr5ZAeQ4u43ipjrgnRLX+2EoRgx9H+Q7gwQpFvA+Za9EMBIhr/0YkiQA6Kx1IExNsUY+zWkP87ZKqvEIP3RAABEtADSQ/x3IDUojTrFPwfpauBP8hWVFtdBOnC9TUR7IV2ZzQPwCaVUNfkZv38O6epnGWPsGAD3Q/pzZkM/gAbFb2Xvx14AuxljTsXiYIxdkGXZSnoh3XJbrChroXwgzAajW1d/g9Rf6vgsy4sAqJRvsaZYBem5JCAVdgGk52F/gvYVlhrbMfP22CoAA4yxuCKtGTNvs6VhjHVDOqH5IqSemQlIjd56AK8oGoIZm+WgzxBO/h9KPfshPXt1Azg2M1++zfn/AFzCGFNekfVCek6rjOH5jLF3VMxsA3ByDj2Kt8vrKxvYzBj6AqQTjxik/gDZohZD2zPW0YwhQW6IxlIHuWv2JZCecXSprPJzAJ8mona5x9m3ALwmX208BeA4IrqBpHeeHET0HuXGjLG75DL+RESZV3mQD+ofhHTLql1eVkHqBKDbK1YFB4B3GWNjJL1+kvUrEJDOdm8lokWyJuXzwP8DMExEXyWiaiKykfQ6htGtsFkwxvohHSS/R0QLiaiCiBqJKPN2sRYDkJ6rapV/GNJzsnR58j6eD6nzD4hofqr3IGPsEIBfA/gGES0gor8DcAnknpDyPnsQ0jPV6wBcJDeeqbLtctkEYJ5cduo/9wiAdUTUQkSLAHwdUueY1LZVAHyQOsBo8RLkKzv5dyDjdyb7AEzr+SgXrP5/yBq+LcdbpdwgbQTQnXHSAZJeb/lvANdmPIMGpBPHO4joRHndJXK9ZiHfIv0bgPQrXHKczod0EkvyfrbL60cgXe3+q5z+EUhXzE/I23ohdWL7JKQe7/9ERO2KsqvksgHALpeROsl9BMCXieh4InJDev75sGLb4yGdNKg+Uxbkhmgs1fk9EY1AeiZzB6QH7plnbGCM/QnSs5InIF19NUJ+viaf6X8IUueWvZD+YB9QKeP/QerE8AIRZZ4NXwMgxBh7jjG2N7VAeuZyKhG15lCnTZAO+gkA/4Lcbvd8A1JvvN2QGptfQboChHw79SJIDfluSD1pfwrpVmA+XAup4doB6ZbXryA9Q8uGH0B61nSAiH6osc4DkPya4kRIt4JT+zcJqbNLik2QegMPQnrOu1ERCz+G9Gz4D/LBeR2An9KRTjrPyeWdJa+bhNzJhjH2DKTONC9CulW5B1JHqhQXAwgwxmI69X0J0knQyxq/ZyDfYr0DwF/kW47v1SlbD17+HwBQA+A3kG41vgVpf16sst4HARwH6bWNEXlJaf4BpLsuz8n/jy2QOj1pkRlDqd7qf8CR3rLPKfKvBHAGpHj+dwAfZYztk69OHwPwbcbYm4yxv0F6hPEoHXndY5dc3vGQOsYlceRq/QFInevCADoBPI2ZneWuAvAz+TmswCSk/7hMIJgNEW0EcCVjLNsrPq4gacSaf8yhM07JIaLXAKxjjHVarUUwE7kh2wrgg/LdEO6QNb4J4H1yRzmBSURjKTCEpBfjTwbwV0ivXzwN6T3G/7BSl0AgEJSKvIe9EpQVdki3d06CdLvrlwB+ZKUggUAgKCXiylIgEAgEAgNEBx+BQCAQCAyY87dhFy9ezDwej2rexMQE7HZ7aQXlgNBnDt71DQwMYOnSbAcfKj28+0/oM4eRvmAwuJ8xlu2A73OeOd9YejwedHR0qOYlEgk4HLkMxlFahD5z8K7v1ltvxZ133mm1DE1495/QZw4jfUS0RzOzDLH0NixJc/gNElGnIu1YInqeiP4mfy5S5N1KRN0kzRH49+qlZk8wGDRbRFER+szBu77+fi7fOkjDu/+EPnPwro83rH5m+TCA8zLSbgHwJ8bYckhDiN0CAETUAunl3pXyNj8ik/M0VldXm9m86Ah95uBdX2Ul3zd2ePef0GcO3vXxhqWNJWPsZUhz2Sm5BNLMB5A/L1Wk/5IxNs4Y2w1pjrzVMIHWs0xeEPrMwbs+p9NptQRdePef0GcO3vXxBo+ntktTo2IwxvqJKDXjxPGYOcZhn5w2CyJaD2lAabjdbgQCATQ3NyMajSKZTMLn8yEYDGLfvn047bTT0NfXh9bWVkQiEUxNTaGtrQ2hUAj19dIoa/39/Whvb0c4HIbNZoPX60VnZycaGhowMTGBwcHBdJnV1dXweDzo6uqCx+NBIpFAPB5P59fW1sLtdiMSiaCxsRHxeBxDQ0PpfKfTCZfLhZ6eHiQSCdTX12NkZCSd73K54HA4EI1GVetUV1cHu91ekjqNj4+jqqoqpzp5vV7EYrGS1GloaAg1NTVF30/51qm3txeBQIDL2PN6vQgEAnC73VzGns/nwx//+Ee0trZyGXterxd//OMfcfbZZ8+o0xtvvAGHwwG73Y7Dhw+jsrIS09PTmJ6eht1ux8TEBIgIlZWVmvkVFRWoqKjA5OQk5s2bh8nJSTDGss632aQbcuPj49i3b59m/vPPP9/25ptvRs0f0o8KpgF0Tk5Oftbn86mOeGT5e5YkTSn0FGOsVf49JE//k8o/wBhbRET3AvgrY+wxOf1BAH9gjD2hV/4ZZ5zBtDr4RKNRrs+uhD5z8K7vhhtuwH/8x39YLUMT3v13NOrbvXs3HA4HXC4XyHh+7aKSOtnVorOzc7S1tVVtgPw5x/T0NO3bt++YvXv37li1apXa2MKWP7NUY0AeXi01zFqqle/DzKmhGiBNaZM3iUQuc7iWHqHPHLzrGx/ne3xr3v13NOobGxvjoqEEgKkprfm0y4+Kigq2ZMmSgwA0J6fgsbH8HY5MP3UdgN8q0q+Up6w5CdIYpf9nxlA8HjdeyUKEPnPwri+ZTBqvZCG8++9o1cdDQwmIxjKTiooKBp020dJnlkT0C0izli8moj5IUxT9O4D/IaJ1AN4GcAUAMMa2E9H/QJq6aRLAF+TpofLG5/PpaDNT8hHyvctNBDgcPpg9eTZj34hs9BXTvhEOhw/Dw9bZB/Trn3reZZV9PUT85bedEjPxp/HkKGfOOEM7r6ampjBGygSre8N+gjFWzxibxxhrYIw9yBiLM8Y+yBhbLn++q1j/DsZYI2OsiTH2R7P2eX/PyOcT+szAuz7e37Pk3X9CnzmOOSbfKWcLx65du+zLly9fabWObOCxN2zJqK2tNVzHyjPTRKLWUvuAfv07Omo1z1x5uDJKJIz3bzHtG5HNUGgi/rTzyiH+9K4M9SjUlangCDw+sywZbrc7vw03bQIqK6V/RGWl9LsIxGIa+kpkXxPZvvviiy21b1R/Tf+VyL4ReQ+FJuKvvONvzx6pNUwtewo3Kl1PTw/OO+88+Hw+XHPNNfO3bt06HwC2b99etWrVqhWtra3NN9xwg7umpua01Db//M//vLS1tbXZ6/W23HjjjW5AumI8+eSTV1555ZUnnnLKKSv/7u/+bvnIyAgBwObNm2uamppa2tvbV9x999116kr4o6wby0gkkvtGmzYB990HpB6OT01Jv4vwh21qUtFXQvuqKOxHmpostQ9A176q/0po34i8OqiI+Cvv+NuzB9i3b2bavn0FazDXr1+Pe+65B8FgEDfffPPExo0bTwCA66+/ftmmTZsGOzs7u9xu9+HU+r/+9a8Xdnd3z9+2bVtXV1fXjlAoVPPHP/6xFgDefvvt+V/84hcHu7u7tx9zzDFTjzzyyCIAWLdunefuu+9+OxQK7SyI6BJh+XuWxUbvPcve3l4sW7ZMNS91G2eWeyorj/xRlNhswOSk8fZZQgQsW9aLt9/O0FdC+6rbK+z3LluGZb29ltmfgYp9Vf+V0L7q9gpuvPFGfP/737fMvh4i/oztzyDL+Ovq6kJzc7Oh/dQha9ZtWL37q4qVNbdXUFtbi5GRkfTvkZERLFmyBE1NTQCAZDI5ffjw4Ym33npru9PpbN+3b19o3rx5ePfddysaGhpWjY6Obl2/fn3D008/vcjhcEwBwOjoaMWNN96494ILLhj+8Ic/7N2zZ08nANx2223HHT58mL761a8Otra2tvT394cB4LXXXqv+5Cc/efLf/va37YZOKQFvvvnm4lWrVnnU8sr6mWU8HtdsLDXR6m5dhG7YLlccM18tLa19Iztxl+vIwcoC+0bpqv4roX0j8np1RMRf+mtZxl8RmZ6ehtPpRCgUAgB0dnaOGQ1KwBjDDTfc0P+Vr3xlvzJ9165ddrvdnj7VsNlsLJlMVjDGuHl1JlfK+jbs0NBQ7hvZNMZu10o3gdM5ZKl9IztDyrFNLbBvlK7qvxLaN2JsbMxS+0aI+NO3b5RelPgrIgsXLsRJJ52E//3f/wUgNYR//etfqwGgvb195OGHH14EAA899NCxqW3OP//84UcffXTxwYMHKwBg9+7d89555x3Ni7DFixdP1dbWTj377LO1APDwww8fq7Uub5R1Y6n3nqUm69fnlm6CYFBFXwntG9nxKV+9scC+Ubqq/0po3wi99yxLYd8IEX/69o3SixJ/SzTmYtZK12F0dBQNDQ3p5e6778bjjz+OBx98EKtWrcIll1xS/cQTTzgB4J577um95557lra1tTX39/fPq62tnQKAyy67bPiKK65498wzz1zh9XpbPvKRjzQODQ3pnrk8+OCD0S9+8YsntLe3r6iurj56ngMyxub04vP5mBYvvviiZp70tEIjc+NGxmw2aQWbTfqdy/ZZADDm92voK5F9o/q/6Pdbat+o/pr+K5F9o/pfd911ltrXQ8RfceJvx44dWdl//XVpUSUaPbLC669Lv3PZXmZ4eFg3PxwOH2KMdTDGOoaHh9+YmprqYIx1PPDAAz3nnHPOgVTeXFpCoVCUabQlZd3BJxQKob29XTWvaB0Ecti+vT2ErVvbLbNvtL3wn7ntN2zYgPvvv98y+0bb8+6/ozH+THfwyZJsth8dHdUdxUc5kPozzzxT+6UvfekExhgWLlw49fDDD0dbW1v5Htw4D0QHHw1cLpfhOlY+i47HXZbaB/Trv2yZC6n+FVbYNyIeN96/xbRvRDaT74r4084rh/gr5uACuUw+ft55543s2rVrR/HU8E9ZP7Ps6emxWoIujY1Cnxl413fgwAGrJejCu/+EPnPwPusNb5T1laXX69XMs/ruNGNALOZFvoMMFcK+EcXUVwj/x2La+7cU9o3Qu7Mh4s94nbkcf/nefs0FvbksBbMp6yvLWMzUdJhFR+gzB+/6eJ+PkXf/CX3mOHz4sPFKgjRl3VgqR6/gEaHPHLzrm5iYsFqCLrz7T+gzx/T0tNUSjirKurHM6z3LEiL0mYN3fXm9Z1lCePef0JcfNpsN7e3tOPvss3H66afj1VdfBQBEo1G0trbmVebxxx/f1t/fr/tY7+DBgxVXXXXVicuWLWs95ZRTVp5xxhlNf/7znxfkY+/RRx91BoPB+XmJzZOybix5n89S6DMH7/p4n8+Sd/8JfflRXV2NUCiEV155BXfeeSduvfXWkti9+uqrPYsWLZqMRqOd3d3d2x955JHdg4ODefWbefLJJ53btm0z7k6uwOxt57JuLLN5dcRKhD5z8K4vm1dHrIR3/5WFvscfBzweoKJC+nz8cfNlythsNgwPD2PRokWz8sbGxvC1r33N7vV6W5qbm1t+//vfOwBgcnIS69evb/B6vS1er7fljjvumDHF1sjICK1du3b59773vcXK9O3bt1dt3bp1wQ9+8IN3bPLQgC0tLRNXXnnlQQD40Y9+dGxbW1vzihUrWq666qoTJ+VB6Wtqak77x3/8x+ObmppaVq1ataK3t7fy+eefX/DCCy84v/71rzesWLGiZfv27VXbt2+vWrt27fKVK1c2+3y+ptTUYpdffrnns5/9bMN73vMe76ZNmxqefvrp2hUrVrSsWLGipbm5ueXAgQNZt4Fc9oYloiYA/61IOhnAvwBwAvgcgNQcNV9jjP0hXzt5zydYIoQ+c/Cuj/feiLz7b87re/xxaRi90VHp9549R4bVu/rqvItNJpNob29HMpnE3r178ec//3nWOvfeey8AIBKJ7Ni6dev8Cy64YHlPT0/nPffcs3jPnj1V27dv3zFv3jwMDAykh7YbHh6uuPzyy0++6qqr4tdff/2M+edCodD8lpaWUbV3O9944435v/rVr47t6OjYWVVVxT75yU+ecP/997uuv/76eDKZrFizZs3IPffc886GDRsa7rnnniV33XVX/7nnnjt04YUXHvz0pz99AADWrFnj/fGPf7ynra1t/M9//vOCjRs3nrBly5YIAPT09Mz/y1/+EqmsrMQ555xzyg9/+MM9H/7whw8dPHiwoqamJusHt1xeWTLGdjHG2hlj7QB8AEYB/EbO/n4qz0xDCUj36HlG6DMH7/ryGsi/hPDuvzmv77bbjjSUKUZHpXQTpG7DdnR04JlnnsG1116LzJHcXnnlFVx00UWTAHDaaaeNud3uiXA4PP/Pf/7zwg0bNuybN28eAGDp0qXp6VYuvvjiU6655pr9mQ2lEc8884yjs7OzZtWqVc0rVqxoeeWVVxa+9dZbVQAwb948lrr69Pl8h/bs2WPP3P7gwYMVW7durb3iiisaV6xY0bJp06YTBwcH56XyL7vssgOpRvq9733vyM0337zsm9/8Zt3+/fttqXpkA5dXlhl8EEAPY2xPoad20Rt2qlCmzAyXVVfXjMFB6+wbkY2+Yto3oq6uGQMD1tkH9Ou/ePFizTwRf8brzOX46+gAfG+/DTUZ7O23EcxyZB+99zXnz5+PNWvWYP/+/diXMaG01jCojDEQkWrmmWeeOfLMM88c8/nPf/7dioqZ12Ht7e1jXV1dNVNTU7BlzNDCGKMrrrgifu+9976TWWZlZSVLlVVZWYnJyclZLpmamoLD4ZjcuXOn6ghDtbW16avHb33rW3svvfTSg7/97W+POeuss5qfeeaZyGmnnZbV9D9HQ2N5JYBfKH5fT0TXAugAcBNjbNYwKES0HsB6AHC73QgEAmhubkY0GkUymYTP50MwGMTBgwexcuVK9PX1obW1FZFIBFNTU2hra4PfH0IsJvVWdLv7EQq1o60tjMlJGyIRL9raOtHb2wC7fQJLlw4iGPTB5wtidLQa0agHLS1diEY9CIcTiMfjaZu1tbVwu92IRCJobGxEPB7H0NBQOt/pdMLlcsHv70Fl5QQOHDgWDsdIuvx43IVEwgGPJ4odO5rh8URRU5NM5w8M1GFiwo5ly/oQDrfi1VeP1CkUCqV7YPb396O9vR3hcBg2mw1erxednZ1oaGjAxMQE/H7tOjkcCbhccUxNEVpaupBI1CIWc6OpKYKenka4XHE4nUMIBn0IBI7UqaenB16vF7FYDCMjI+k6u1wuOBwORKPR9H7y+7Xr5PVGUFk5hXC4De3t2vtp/vwkAoGudJ0GBwfTNqurq+HxeNDV1QWPx4NEYuZ+8vm06+TzBTE05EQ87kJjYw927fLC7Y6p7qdAIKoae3V1dYjFYggEArNiLxQKwes1H3sORwKBQO6x19PTg/p6L8466y+Ix5fkHXtebwSbN+cee4ODg3A49GMvGPThQx96Hjt3rtDdT6FQ7rGXTCbT9vONvUjEiw996Hl0d793RuyNjY1hZGQEVVVVGBsbg91ux9TUFKamplBTU4PR0VFUVFRg3rx5mKxvwLzY7PH8Dh8n7fuqqnGMjVVh3rzDsNmmcehQDRYsGMXkpA1TUzZUVU3g8OH5GB8fB2MsXT4gPZM8dOgQYrEYJicnYbfbMTw8jOnpaYyNjWHNmjV4+umnKz/3uc9h27ZtVf39/fZTTz117Nxzzx2+//77l/zDP/xDInUbNnV1+Z3vfCf2ta99rf6aa6454fHHH39bqXnlypXjp5566qEvf/nL7u9///uxiooKhMPhqjfffLP6vPPOG77ssstO+drXvjZw/PHHTw4MDNgOHjxo83q9mu9W1dbWTg0PD1cAwLHHHjvd0NAw8dBDDy36zGc+c2B6ehqvvfZa9Zo1a2ZNGLt9+/aq1atXJ1evXp187bXXFnR2ds7PtrG0fFYQvQWAHcB+AEvl30sB2CDdPr4DwENGZRRl1pEsKOqsDyWyb7S98J+57fOedaRA9o22591/R2P85TLrSM83HmOspuaIGED6/dhjWW2vNetIRUUFW7VqFWtra2Onnnoqe+qppxhjjO3evZutXLmSMcZYMplkF1544eHly5ePrlixYvR3v/vdLsZYx8TERMe6dev2nnzyyUmv1zt6xx137GGMdbjd7vFYLBaamprquPzyy/d//vOf38syZvSIx+NvfPzjH9/X0NAwtnz58tEzzzwzEQgEdjDGOn784x/3NDU1jS5fvny0paXl0AsvvNDFGOuorq6eSm3/0EMP9Vx22WX7GWMdzz77bNfJJ5+cXLFixWhnZ2e4q6tr29lnn33Q6/WOnnzyycmbbrrpHcZYx2WXXbb/oYce6kmVce211w6ccsopSa/XO3rhhRfGR0dHgyzLWUcsbxD1FgCXAHhOI88DoNOoDL3GUm+KGh6mSHI4NPRxMkXSsMPB9RRJmv4rkX2j+t9yyy2W2tdDxF9x4i/nKboee4yxE09kjEj6fOyxgk3RNTk5qZuvnKKrXBa9xpLLDj4KPgHFLVgiUr7F/REAnWYKz+s9qE2bgPvuA6bk59pTU9LvTZvMSFHF51PRV0L7qijsB30+S+0D0LWv6r8S2jcir/csRfyVV/xdfTUQjQLT09Ln2WcDGc8XsW+f1FM2R0YzOw8JdOG2sSSiGgAfAvBrRfJdRBQmom0APgDgRjM26urqjFfK5Mc/zi3dBAMDKvpKaN/ITp2y94IF9o3SVf1XQvtGLFiQx+AlIv7SX8sy/jIbSqN0HXKZokvAcQcfxtgoAFdG2jWFtGG3z+qFbMzUVG7pJpiYUNFXQvtGduzKsU0tsG+Uruq/Eto3IrNXYKntGyHiT9++UXpR4q+AFPrtgrkOt1eWpaCvry/3jbQOcPkc+AxYtkxFXwntG9npW7bMUvtG6ar+K6F9I4aHhy21b4SIP337RulFib8CImYdyY2ybizzGjQ4NYJGtukmCIdV9JXQvpGd1nDYUvtG6ar+K6F9I/J6DCDiL/21LONvyZLc0nWYP7+k45Af9ZR1YxmJRHLf6Ec/AjZuPHImabNJv3/0o8KKA+D1qugroX1VFPYjXq+l9gHo2lf1XwntGxGP5zTQScHtGyHiT98+gNLH34knzm4YlyyR0nNkfHy8QKLKA2LM4inZi8wZZ5zBOjrUh7vYvHkz1q5dq5rHwwgqa9duxubN6vpKYd+IbPQV074Ra9duxssv5+e/Uuz/T3/60/iv//ovy+zrIeIvv+2UqMVfV1eX7shhKTQOWTmjNoKPzWZDW1sbpqamMG/ePPznf/4nzjrrLESjUVx44YXo7JReMujs7BxtbW3tysbO8ccf39bR0dFVX18/qbXOwYMHKzZu3Lhs8+bNjqqqKuZ0OifvuuuuvnPOOedQrvV69NFHnS0tLWM+ny+7AQWy5M0331y8atUqj1oetx18SkFbW5vVEnQJh4U+M/Cub+nSpVZL0IV3/wl9+ZEaG3ZychJ/+tOfcOutt+Kll14qut2rr77ac+KJJ45Ho9FOm82GHTt22HOdZivFk08+6ZycnDyYS2N5+PBh5DIWbCZl3ViGQiH4/X7VPKsvuBkDAgFtfaWwb0Qx9RXC/4FACIDfMvtG7N2711L7eoj4M1+GmfhLXxE+/rg0cPrbbwMnnADccYepGUeUJJNJwym6du7c2WKz2XDXXXf1XnTRRYnJyUls2rSpIRAILASA6667bv9tt92WHqF3ZGSEzj///FMuvfTSAzfddNP+VHpqiq4nn3zyLeUUXS0tLROANEXXfffdt/Tw4cN0+umnH3rkkUf2VFZWoqam5rR169YNPvfcc8fMnz9/+qmnnureuXNn1QsvvODcsmWL49vf/nb9E0880QMAGzZsOOHdd9+tnD9//vRPf/rTPaeddtrY5Zdf7lm0aNFkOByuOfXUU0cvvfTSoZtuuukEQOoN/Oqrr+5ctGhRVjOPlHVjyftM9UKfOXjXV1tba7UEXXj335zXJ6bo4mqKrrJuLAUCgYBb9KboMtFYpm7Djo2NYevWrbj22mvTzylT5DtF1w033LB348aN7+aiRzlFFwCMjY1V1NXVTQKzp+h64YUXFmZur5yiK5U2MTGRfuqsNkXXxz72sXc/8YlPHGhsbDy657MsFXkNN1ZChD5z8K5vZGTEagm68O6/Oa/v7bdzS8+Rw4cPF2WKrunp2e2PcooulTLpiiuuiO/cuXPHzp07d0Sj0c677747BuQ+RVdqeeutt7an8jOn6PrpT3+6J5lMVpx11lnNW7duzfr9mbJuLNvb262WoIvQZw7e9R133HFWS9CFd//NeX0nnJBbeo5UV1dj586dmJqagss1Y7A0vO9978PTTz9dCUB1iq7UgAbK27Df+c53Yscee+zkNddcM0ugcoquVGMaDoerHnvsMed55503/NRTTy165513KlNlRiIR3eGPtKboAoDp6Wn89a9/Ve04lJqi64477tjb1tZ2qLOzUzSW2RBWvtTMIUKfOXjXN5DvzMAlgnf/zXl9d9wB1NTMTKupkdJNkHpmefrpp+PjH/84fvazn80aenHTpk2YmpqC1+tt+fjHP974wAMPRKurq9mNN964r6GhYWLFihUrm5qaWh588MFjlds9+OCDvePj4xUbNmxoyLT72GOPRQcGBuadeOKJrV6vt2XdunWeZcuWTfh8vrGvf/3r73zwgx/0er3elnPOOcfb29ur22316quvfveHP/zhcc3NzS3bt2+v+sUvfvHWf/3Xfy1uampqWb58+connnjCqbbdXXfdVbd8+fKVTU1NLdXV1dMf/ehHD2brt7J+z/LVV1/FWWedVWJF2SP0mYN3fevWrcODDz5otQxNePff0agv2/cs0xSxN+zIyIhuJ7Nc3rOcK4j3LDXwer1WS9BF6DMH7/oyb33xBu/+Kwt9V19dsMYxk6qqqqKUO1cp69uwmT3AeEPoMwfv+gYHB41XshDe/Sf0mWNsrKCD38x5yvrKsqFh1m31NDwMN9bY2ICeHuvsG5GNPiuHG2tsbEB3t3X2Af36L1w4qxd8Se3rIeIvv+2UaMWf3KNUd9tiDneXwsxoNnOR6elpAqD5KklZX1lOKOfD4xC7XegzA+/61LrR8wTv/jsa9c2fPx/xeFzz1YxSwoMGXpienqZ9+/YdA0DzdkBZX1kODg6ipaVFdx0rz0yXLh3Ejh36+oppH9CvfyAwCL9fXR8PV0ZLlw4CyM9/hbBvxKFDxuNHi/jTzjsa46+hoQF9fX2z3mvMZL88UFwek4kAkAb7AYAune45Y2NjutN07d27t3JqampxfgqOOqYBdE5OTn5Wcw3GGJcLgCiAMIAQgA457VgAzwP4m/y5yKgcn8/HtBgeHtbMk/4mGpkbNzJms0kr2GzS71y2zwKAMYdDQ1+J7BvVf9jhsNS+Uf01/Vci+0b1v+WWWyy1r4eIv7kff3rHP6kM6bgrFrlNslqApjCpsVyckXYXgFvk77cA+LZROXqN5YsvvqiZpxlsGzceyVQuGQFbiD+r36+ir4T2jer/ot9vqX2j+qv6r4T2jep/3XXXWWpfDxF/cz/+9I5/UhmisVQulgvQFKbeWO4CUC9/rwewy6gcvcZyy5YtmnmawZY6o8tcbLbsts8SgLHVq1X0ldC+Uf23rF5tqX2j+qv6r4T2jeq/bt06S+3rIeJv7sef3vFPKkM0lsqF52eWDMBz8jiEDzDGfgxgKWOsHwAYY/1EVKe2IRGtB7AeANxuNwKBAJqbmxGNRpFMJuHz+RAMBlFVVYXu7m709fWhtbUVkUgEU1NTaGtrg98fQixWj127pDEe29vbEQ6HYVu9Gt5IBJ1tbWjo7cWE3Y7BpUvhCwYRDARQXV0Nj8cDv78L0agH4XAC8Xg8bbO2thZutxuRSASNjY2Ix+MYGhpK5zudTrhcLvj9Pdi3bzE6OjowMjKSzne1tMCRSCDq8aB5xw5EPR4ka2rS9uvq6mC32+H39yEcbsWrrx6pUygUSs+EMKNONhu8Xi86OzvR0NCAiYkJ+P2DCAZ9CASC6Tp1dXXBs2wZEg4H4i4XTohGEfD7UZtIwB2LIRIIpOvk9w+lt0/VqaenB16vF7FYbGadXC44HA5Eo9H0fvL7k+ntU3Xq6+tDq9OJiNeLqcpKtIXDCLW3oz4Wk+oUCKTrtGaNDfG4C4FAIF2nwcHBtM0ZdfJ4kEjM3E8+Xy1iMTcCgYz9VFODoM8H59AQXPE4ehob4d21CzG3GyOBQHr7tjYXEgkHAoGoauzV1dWhoqICgUBgVuyFQiF4vdJ+CgQy9pPTqR57Ph+qX3ttRp0cjgQCgdxjr6enB/X1XtTUjCKgqJPL5YJj2TL12PP5ULdjR3o/uVyt8Hoj2Lw599gbHByEw+GDzxfEa69l7KeWFsRdLviCQexbsgQdPp8Ue01NaOztTdcptX0olHvsJZPJ9PY7dihir7UVkdWr1WPP7Ub70FC6Ti6XF0uW7EN3d3fOsVdbW4v6ejeamiLo7c3YT2vXqseewwFfIpGuk8fjgMcTxcCAeuzZ7Xbs27cP+/fvnxV7vM/mYhlWt9ZaCwC3/FkH4E0A7wMwlLHOAaNyCn4btoRn1qq3cTg6s59xG4zDM/ui3AYroP/zug0r4k/EX4H8L27D5rZw++oIYywmfw4C+A2A1QAGiKgeAORPU291ezye3DdKzSeXbboJolGPpfaN7HiiUUvtG6Wr+q+E9o1wOp2W2jdCxJ++faN03uMvr+NfOWN1a622AFgAwKH4/iqA8wB8BzM7+NxlVJbeleW2bds083TPzErUG7CtTUMfJ70Rt7W1cd0bUdN/JbJvVP8NGzZYal8PEX9zP/70jn9SGeLKUrlYLkBVFHAypFuvbwLYDuA2Od0F4E+QXh35E4BjjcoyexvW7JIvqds4Vto3WrLRV0z72eiz0r5R/bO5DSviT8RfsfwvbsPmtnDZwYcx9haAVSrpcQAfLJQdn89XqKKKQjAo9JmBd328d6Tg3X9Cnzl4P/7xBrfPLEtBMBjUzCvUuV2+MAb87ndBS+0bLdnoK6b9bPRZad+o/v39/ZbaN6q/iL+5HX96xz/BbMq6sdSby40HhD5z8K7PbtedDN5yePef0GcO3vXxRlk3lm6322oJugh95uBdn8PhsFqCLrz7T+gzB+/6eKOsG8tIJGK1BF2EPnPwri8ej1stQRfe/Sf0mYN3fbxR1o1lY2Oj1RJ0EfrMwbu+RYsWWS1BF979J/SZg3d9vFHWjSXvZ/ZCnzl415dMJq2WoAvv/hP6zMG7Pt4o68ZyaGjIagm6CH3m4F3f2NiY1RJ04d1/Qp85eNfHG2XdWPL+npHQZw7e9fH+niXv/hP6zMG7Pt4o68aS9/eMhD5z8K5P7z1LHuDdf0KfOXjXxxtcjuBTKvQGsiYqjI18X4wmAtrbnQiFrLNvRDb6imnfiPZ2J7Zutc4+oF//+fPnW2pfDxF/+W2nhPf4y2sg/zKmrK8sXS6X1RJ0iceFPjPwrq+6utpqCbrw7j+hzxy8H/94o6wby56eHsN1Sj3Ml5LGxh5L7QP6Nh55RFtfKewb1b+x0Xj/FtO+EQcOHLDUvhEi/uZ2/GVz/BMcoawbS6/Xm9+GmzYBlZXSvZLKSul3Edi1S0NfiexrItv3XnWVpfaN6q/pvxLZNyLvM3sRfyL+CuD/vI9/5YrV054Ue9Gbouv111/XzEudo81i40b1k7mMOeU0t88SgDGfT0VfCe0b1f91n89S+0b1V/VfCe0b1f9zn/ucpfb1EPE39+NP7/gnlSGm6FIulgso9mJ2PstZpCZdzVxstuy2zxJAYz68Eto3qv+Lfr+l9o3qX4j5BM3YN6p/NvNZFtO+HiL+5n78ifksc1vK+jZsXu8ZTU3llm4C1fnwSmjfyI5P2fXcAvtG6UWZT7CA/s/rPUsRf+mvIv6ySNdBvGeZG2XdWOb1npHNllu6CXw+FX0ltG9kJ6j8s1lg3yhd1X8ltG9EXu9ZivhLfxXxl0W6DuI9y9zgsrEkomVE9CIRdRHRdiL6kpx+OxG9Q0QhebnAjJ28OlisX59buglUu56X0L6RHZdybEkL7BulF6XrfgH9n9erIyL+0l9F/GWRroN4dSRHrL4PrLYAqAdwuvzdASACoAXA7QBuzqUsvWeWu3fv1szTvee/ceORZwc226yH64bbZwHAmMejoa9E9o3qv9vjsdS+Uf01/Vci+0b1/9KXvmSpfT1E/M39+NM7/klliGeWysVyAVmJBH4L4EOFbiyz6eBjdsmXVAcBK+0bLdnoK6b9bPRZad+o/tl08BHxJ+KvWP4XHXxyW7gf7o6IPABOA/AagL8DcD0RXQugA8BNjLEDKtusB7AekGYDDwQCaG5uRjQaRTKZhM/nQzAYRFVVFbq7u9HX14fW1lZEIhFMTU2hra0Nfn8IsZjUAcPt7kco1I62tjAmJ22IRLxoa+tEb28D7PYJLF06iGDQB58viNHRakSjHrS0dCEa9SAcTiAej6dt1tbWwu12IxKJoLGxEfF4HENDQ+l8p9MJl8sFv78H+/Yths/XAYdjJF1+PO5CIuGAxxPFjh3N8HiiqKlJpvMHBuowMWHHsmV9CIdb8eqrR+oUCoXSnUr6+/vR3t6OcDgMm80Gr9eLzs5ONDQ0YGJiAn6/dp0cjgRcrjii0RPg9weQSNQiFnOjqSmCnp5GuFxxOJ1DCAZ9CASO1KmnpwderxexWAwjIyPpOrtcLjgcDkSj0fR+8vu16+T1RlBZOYVwuA3t7dr7KRarRyAQSNdpcHAwbbO6uhoejwddXV3weDxIJGbuJ59Pu04+XxBDQ07E4y40NvZg1y4v3O6Y6n4KBKKqsVdXVwe73Y5AIDAr9kKhELxe87HncCQQCOQeez09Paiv9wJg8PsDecee1xvB5s25x97g4CAcDv3YCwZ9WLBgBD5fh+5+CoVyj71kMpm2n2/sRSJeLFgwgu7u7pxjr7a2FvX15mPP44liYEA79kZGRrB///5Zscf7AP+WYXVrrbcAqAUQBHCZ/HspABukZ613AHjIqAy9K8stW7Zo5vGA0GcO3vWtW7fOagm68O4/oc8cRvogrixnLFx28AEAIpoH4AkAjzPGfg0AjLEBxtgUY2wawE8ArDZjg/fJd4U+c/Cub3Jy0moJuvDuP6HPHLzr4w0uG0siIgAPAuhijN2tSFfeH/gIgE4zdnh/z0joMwfv+ni/3cW7/4Q+c/Cujze4bCwhPZu8BsA5Ga+J3EVEYSLaBuADAG40Y4T394yEPnPwrk/MZ2kOoc8cvOvjDS47+DDGXgGgNqPbHwppp66urpDFFRyhzxy861uwYIHVEnTh3X9Cnzl418cbvF5ZlgS73W61BF2EPnPwrs9WqlFn8oR3/wl95uBdH2+UdWPZ19dntQRdhD5z8K5veHjYagm68O4/oc8cvOvjjbJuLFtbW62WoIvQZw7e9fF+G4x3/wl95uBdH2+UdWMZiUQ084gKs+QLEXDxxRFL7Rst2egrpv1s9Flp36j+ceXYphbYN6q/iL+5HX96xz/BbMq6sZwq1bQ+eVJZKfSZgXd909PTVkvQhXf/CX3m4P34xxtc9oYtFW1tbYbrSAMH5Y6Zs9oU4XCbpfYB/foPDbXB6bTOvh5Ekv+stG/E0qVLLbVvhIi/uR1/2Rz/BEco6yvLUChktQRd2ttDVkvQRfjPHHv37rVagi68+0/Enzl49x9v5NRYElEFES0slphSk/cIKps2AZWV0ulbZaX0uwikBmm2yr4msv36z3/eUvtG9df0X4nsG1FbW2upfSNE/OnbP9rjj/cRpLjDaPBYAD8HsBDAAgA7AfQD+IrVg9pmu+gNpL5z507NPM0pbjZuZKpz4WTMKVeIKYK8XhV9JbRvVP+dXq+l9o3qr+q/Eto3qv8XvvAFS+3rIeJv7sef3vFPKkMMpK5cjFcAQvLn1QDuBjAPwDarhWe7mJ3PchapSVczF5stu+2zRHM+vBLaN6r/i36/pfaN6l+I+QTN2DeqfzbzWRbTvh4i/uZ+/In5LHNbsrkNO0+eAeRSAL9ljB0GwAp6eWsR7e3tuW+k1YOsCD3LQqF2S+0b2WlXPvOwwL5Ruqr/SmjfiOOOO85S+0aI+NO3b5TOe/zldfwrY7JpLB8AEIV0G/ZlIjoRAN9Dj2RJOBzOfSOtIcqKMHRZW5uKvhLaN7ITVvams8C+Ubqq/0po34iBgQFL7Rsh4k/fvlE67/GX1/GvjDFsLBljP2SMHc8Yu0C+Ot8D4AMl0FZ08hqbc/363NJNMDmpoq+E9o3s2JTzMVpg3yhd1X8ltG9ERUUendFF/KW/ivjLIl0H3scm5g6t+7MAPil/flltsfr+cbaL3jPLffv2aebp3vPfuPHIswObbdbDdcPtswBgzOXS0Fci+0b13+dyWWrfqP6a/iuRfaP6f+UrX7HUvh4i/uZ+/Okd/6QyxDNL5aKdAXxe/vxXtcVq4dkuZjv4mF3yJdVBwEr7Rks2+oppPxt9Vto3qn82HXxE/In4K5b/RQef3BbNEXwYYw/In/+WmUdEc2Jul4aGBqsl6NLbK/SZgXd9Cxfy/coy7/4T+szB+/GPNwyHuyOiAIBPMcai8u8zAfwUwKqiKisBExMTmnmMlVCIhv0dOybQ0mKdfSOKqa8Q/t+xQ3v/lsK+EXpjc4r4M15HxJ859I5/gtlk08PgTgDPENEmIroDUu/YTxdXljZEdB4R7SKibiK6xUxZg4ODhZJVFIQ+c/Cu79ChQ1ZL0IV3/wl95uBdH28YXlkyxp4log0AngewH8BpjDFLBrUkIhuAewF8CEAfgNeJ6HeMsR35lOfz+Qopr+AIfebgXR/vw43x7j+hzxy86+MNwytLIvpnAPcAeB+A2wEEiOgfiqxLi9UAuhljbzHGJgD8EsAl+RYWDAYLJqwYCH3m4F1ff3+/1RJ04d1/Qp85eNfHG8QMbo4T0Q8A3MIYS8q/TwTwU8bYh0qgL1PLRwGcxxj7rPz7GgDvYYxdn7HeegDrAcDpdPouueQSLF68GENDQ5icnER9fT36+/sxNjaGuro6DA8Po66uDvF4HNPT01i6dCn27t2bHuh6ZGQExx13HAYGBlBRUQGXy4XBwUEsXLgQU1NTOHToULrMyspKOJ1O7N+/H06nE+Pj40gmk+l8u90Oh8OBeDyORYsWIZlMYmxsLJ0/f/58VFdX48CBA5iamkJ1dTUmJibS+dXV1aiqqsLQ0JBqnRYsWACbzVaSOqXIpU4ulwuJRKIkdTp8+DAqKiqKvp/yrdPLL78Mn8/HZey5XC68/fbbWLBgAZexV19fj127dmHx4sVcxp7L5UJ3dzcaGhq4jD2bzYa+vj6ccsopmnW69957g4yxM4pyMD8KMWwseYKIrgDw9xmN5WrG2D9qbXPGGWewjo4O1byBgYGs5hS0CqHPHLzru/nmm/Hd737Xahma8O4/oc8cRvqISDSWCrK5DbuEiL5LRH8goj+nllKIU6EPwDLF7wYAsXwL6+rqMi2omAh95uBd3/79+62WoAvv/hP6zMG7Pt7Ipjfs4wC6AJwE4N8gjRP7ehE16fE6gOVEdJL8rueVAH6Xb2Eej6dQuoqC0GcO3vU5nU6rJejCu/+EPnPwro83DHvDAnAxxh4koi8xxl4C8BIRvVRsYWowxiaJ6HoAzwKwAXiIMbY93/ISiYRmHlG+pc4k37vcREBbWwJmxzo2Y9+IbPQV074RbW0JbNtmnX1Av/7j4+OW2tdDxF9+2ynhPf70jn+C2WTTWB6WP/vlXrAxSLc/LYEx9gcAfyhEWfF4vBDFFA2XS+gzA+/6lJ2keIR3/wl95uD9+Mcb2TSW3ySiYwDcBOkVkoUAbiyqqhKRzXtGVp6ZBoM+S+0DRmemPjgc1tnXg0jyn5X2jcjmPUsRf9p5Iv707Rsh3rPMjWym6HqKMXaQMdbJGPsAY8zHGMv7OSFP5P2e0aZNQGWlFJGVldLvIuDzaegrkX1NZPvBiy+21L5R/TX9VyL7RuT9nqWIPxF/BfC/eM8yR3IZdR3AG1aP/J7rojfryOuvv66Zpzlq/8aNRzKVS8Y0OYWY9cDnU9FXQvtG9X/d57PUvlH9Vf1XQvtG9f/c5z5nqX09RPzN/fjTO/5JZYhZR5SLdob0XNCTkbbVasG5LnqN5TvvvKOZpxlsqXnkMhebLbvtswRgrL5eRV8J7RvV/536ekvtG9Vf1X8ltG9U/y9/+cuW2tdDxN/cjz+9459UhmgslYvebdiHATxHRLcR0Tw57emiXeJaQCQSyX0jrZkidGaQyJemJhV9JbRvZCfS1GSpfaN0Vf+V0L4ReXWwEPGX/iriL4t0HfI6/pUxmo0lY+x/AJwGqUNPBxHdDOBdIvoyEX25VAKLSWNjY+4b2Wy5pZugp0dFXwntG9lp7Omx1L5Ruqr/SmjfiEWLFllq3wgRf/r2jdJ5j7+8jn9ljFEHn8MADgGoAuDIWI568jqzX78+t3QTqHY9L6F9Iztxl8tS+0bpRem6X0D/5/XqiIi/9FcRf1mk6yBeHckRrfuzAM4DsAPAvwOosfp+cb6L3jPLF198UTNP957/xo1Hnh3YbLMerhtunwUAY36/hr4S2Teq/4t+v6X2jeqv6b8S2Teq/3XXXWepfT1E/M39+NM7/klliGeWykVzIHUi2gxgAzMxQg4P6A2knkgk4NB4USv1npKGewwpxPYORwLDw/ldxJdCv/Cfue1vvfVW3HnnnZbZN9qed/+J+DO3vZ7/pDLEQOpK9J5Zrj3aG0ojsnnPiCi/pRD4fEFL7QP6Ni6+WFtfKewb1b8Q77kV0//ZvGcp4k/EX7H8L96zzI1sBlKfs/A+kPXQkNNqCboIfeaYP3++1RJ04d1/Qp85eD/+8UY2w93NWVzKDgIZ5Hv7o1AwBvT2urBsmfG6xbJvRDH1FcL/vb3a+7cU9o2orq621L4eIv7Ml8F7/Okd/wSzKesryx5l13MOEfrMwbu+AwcOWC1BF979J/SZg3d9vFHWjaXX67Vagi5Cnzl418f7mT3v/hP6zMG7Pt4o68YyFotZLUEXoc8cvOvjfT5B3v0n9JmDd328UdaN5cjIiNUSdBH6zMG7vomJCasl6MK7/4Q+c/CujzfKurHkfT43oc8cvOvLZj5LK+Hdf0KfOXjXxxvcNZZE9B0i2klE24joN0TklNM9RJQkopC83G/WFu/vGQl95uBdX97zWZYI3v0n9JmDd328wV1jCeB5AK2MsVMBRADcqsjrYYy1y8sGs4Z472Ah9JmDd316r47wAO/+E/rMwbs+3uDuPUvG2HOKn1sAfLRYtvSHeiqMDTPDVXk8DkSj1tk3Iht9xbRvhMfjwO7d1tkH9OtfVVVlqX09RPzlt50S3uNP7/gnmA13jWUGnwHw34rfJxHRVgDDAL7OGNusthERrQewHgDcbjcCgQCam5sRjUaRTCbh8/kQDAaxb98+TE5Ooq+vD62trYhEIpiamkJbWxv8/hBiMemZktvdj1CoHW1tYUxO2hCJeNHW1one3gbY7RNYunQQwaAPPl8Qo6PViEY9aGnpQjTqQTicQDweT9usra2F2+1GJBJBY2Mj4vE4hoaG0vlOpxMulwt+fw9qaxNwufbD4RhJlx+Pu5BIOODxRLFjRzM8nihqapLp/IGBOkxM2LFsWR/C4Va8+uqROoVCofRzsv7+frS3tyMcDsNms8Hr9aKzsxMNDQ2YmJiA369dJ4cjAZcrDrt9HB5PFIlELWIxN5qaIujpaYTLFYfTOYRg0IdA4Eidenp64PV6EYvFMDIykq6zy+WCw+FANBpN7ye/X7tOXm8ElZVTCIfb0N6uvZ+cziEEAtF0nQYHB9M2q6ur4fF40NXVBY/Hg0Ri5n7y+bTr5PMFMTTkRDzuQmNjD3bt8sLtjqnup0Agqhp7dXV16O/vRyAQmBV7oVAIXq/52HM4EggEco+9np4e1Nd7sWbNq/B4onnHntcbwebNucfe4OAgHA792AsGffD7AwiHW3X3UyiUe+wlk8m0/XxjLxLxwu8PoLv77Jxjr7a2FvX15mPP44liYEA99ux2O1555RVceOGFs2KP92fpVqE5kHpRjRK9AOA4lazbGGO/lde5DcAZAC5jjDEiqgJQyxiLE5EPwJMAVjLGhvVs6Q2kPjAwgKVLl2polD6tHIi5rm4AAwPq+kph32h74T9z299888347ne/a5l9o+1595+IP3Pb6/lPKkMMpK7EkmeWjLFzGWOtKkuqobwOwIUArpanigFjbJwxFpe/BwH0ADD1Vm0033tMmzYBlZVSRFZWSr+LgMcTtdS+JrL96MUXW2rfqP6a/iuRfSOGhoYstW+EiD99+0d7/OV9/CtXrJ4jLHPBkXk0l2SkLwFgk7+fDOAdAMcalVfw+Sw3bjySqVwy5pQr2nyCJbRvVP8X/X5L7RvVvyjzCRbQ/3nNZyniT8Rfgfwv5rMs0HyWVkFE3QCqAKSm8d7CGNtARJcD+AaASQBTAP6VMfZ7o/IKPp9lZSUwNTV7A5sNmJw03j5LiDTmwyuhfdXtFfYTDgccqVFoLLA/AxX7RZlPsID+z2s+SxF/Iv4K5H8xn2VucPfqCGPsFMbYMpbxighj7AnG2ErG2CrG2OnZNJRG5PWekVqg6qWbQHU+vBLaN7ITVL7UbIF9o/RCzCdoxr4Reb1nKeIv/VXEXxbpOoj3LHODu8aylNTV1eW+kc2WW7oJBgZU9JXQvpGduoEBS+0bpav6r4T2jViwYIGl9o0Q8adv3yid9/jL6/hXxpR1Y2m323PfaP363NJNMDGhoq+E9o3s2JVjm1pg3yhd1X8ltG+ELZ8DvIi/9FcRf1mk65DX8a+csfqhabGXgnfwYUx6mG6zSSvYbLMerhtunwW6HQRKZN+o/i/6/ZbaN6p/UTpY5GC/KB18CmhfDxF/cz/+RAefo7yDT6HR6+Czf/9+LF68WDWPhxFUXK79iMfV9ZXCvhHZ6CumfSNcrv3Yvz8//5Vi///TP/0T7rrrLsvs6yHiL7/tlPAef3rHP0mD6OCjpKxvw0YiEasl6OL1Cn1m4F1fPB43XslCePef0GcO3o9/vMH7cHdFZUqnB5nVF9yMAZs3T2HtWuvsG1FMfYXw/+bN+feQLMX+n56ettS+HiL+zJfBe/zpHf8EsynrK8u2tjarJegi9JmDd316Q43xAO/+E/rMwbs+3ijrxjIUClktQRehzxy869u7d6/VEnTh3X9Cnzl418cbZd1Y8j66vtBnDt711dbWWi1BF979J/SZg3d9vFHWjaVAIBAIBNlQ1o1lXsONlRChzxy86xsZGbFagi68+0/oMwfv+nijrBvL9vZ2qyXoIvSZg3d9xx2nNqUrP/DuP6HPHLzr442ybizD4bDVEnQR+szBu74B5dimHMK7/4Q+c/CujzfKurHMa2zOEiL0mYN3fRUVfP/9ePef0GcO3vXxRlkPSuD1ejXz+BhuzAuzg7wUd7gxY33WDjfmxf791tkH9Ovvcrksta+HiL/8tlPCe/zpHf8Es+H71LbIdHZ2Wi1Bl7Y2oc8MvOsbHBy0WoIuvPtP6DMH78c/3ijrK8uGhgbDdaw8M+3tbbDUPqBf/+7uBpxyinX29SCS/GelfSMWLlxoqX0jRPzN7fjL5vgnOAJ3V5ZEdDsRvUNEIXm5QJF3KxF1E9EuIvp7s7YmlPPh5cKmTUBlpRSRlZXS7yJgt2voK5F9TWT7ExdfbKl9o/pr+q9E9o3Ie2xOEX8i/grg/7yPf+WK1XOEZS4Abgdws0p6C4A3AVQBOAlADwCbUXkFn89y48YjmcolY065os0nWEL7RvV/0e+31L5R/Ysyn2AB/Z/XfJYi/kT8Fcj/Yj7Lo3w+SyK6HcAIY+y7Gem3AgBj7E7597MAbmeM/VWvPL35LBOJBBwOh4YO6XOWeyorAbUrApsNmJw03j5LiACHI4Hh4Qx9JbSvur3CfsLhgCORsMz+DFTsq/qvhPZVt1dw66234s4777TMvh4i/oztz+AojD+9459UhpjPUgmvzyyvJ6JrAXQAuIkxdgDA8QC2KNbpk9NmQUTrAawHALfbjUAggObmZkSjUSSTSfh8PgSDQezbtw+nnXYa+vr60NraikgkgqmpKbS1tcHvDyEWq8euXdJIF+3t7QiHw7CtXg1vJILOtjY09PZiwm7H4NKl8AWDCAYCqK6uhsfjgd/fhWjUg3A4gXg8nrZZW1sLt9uNSCSCxsZGxONxDA0NpfOdTidcLhf8/h7U1ibQ0VGPkZGRdL6rpQWORAJRjwfNO3Yg6vEgWVOTtl9XVwe73Q6/vw/hcCteffVInUKhUHo8yBl1stng9XrR2dmJhoYGTExMwO8fRDDoQyAQTNepq6sLnmXLkHA4EHe5MG63o2piArWJBNyxGCKBQLpOfv9QevtUnXp6euD1ehGLxWbWyeWCw+FANBpN7ye/P5nePlWnvr4+tDqdiHi9mKqsRFs4jFB7O+pjMalOgUC6TmvW2OB0DiEQqEnXaXBwMG1zRp08HiQSM/eTz1eLWMyNQCBjP9XUIOjzwTk0BFc8jp7GRnh37ULM7cZIIJDevq3NhUTCgUAgqhp7dXV1eOuttxAIBGbFXigUgtcr7adAIGM/OZ3qsefzofq112bUyeFIIBDIPfZ6enpQX++F3x9AIOCeuZ+WLVOPPZ8PdTt2pPeTy9UKrzeCzZtzj73BwUE4HD74fEG89lrGfmppQdzlgi8YxBOXX47WcFiKvaYmNPb2puuU2j4Uyj32kslkevsdOxSx19qKyOrV6rHndqN9aChdJ5fLi4suegrd3WfnHHu1tbWor3ejqSmC3t6M/bR2rXrsORzwJRLpOnk8Dng8UQwMqMee3W7HK6+8ggsvvHBW7IkxYzWw4nIWwAsAOlWWSwAsBWCD9Dz1DgAPydvcC+CTijIeBHC5kS2927BbtmzRzNO8jWGzMdXbIDZbdttnCcDY6tUq+kpo36j+W1avttS+Uf1V/VdC+0b1X7dunaX29RDxN/fjT+/4J5UhbsMqF0s6+DDGzmWMtaosv2WMDTDGphhj0wB+AmC1vFkfgGWKYhoAxMzo8Hg8uW+0fn1u6SaIRj2W2jey44lGLbVvlK7qvxLaN8LpdFpq3wgRf/r2jdJ5j7+8jn/ljNWtdeYCoF7x/UYAv5S/r8TMDj5vwYoOPoxJD9NTZ3g226yH64bbZ4FuB4ES2Teq/4t+v6X2jepflA4WOdg3qn9eHXwKaF8PEX9zP/5EB58c2yarBcwSBDwKIAxgG4DfZTSet0HqBbsLwPnZlKfXWO7evVszT+1ORz5LvgCMeTy7LbVvtGSjr5j2s9FnpX2j+n/pS1+y1L5R/UX8ze340zv+SRpEY6lcuOvgwxi7RifvDkjPMQtCItWTjlMcDqHPDLzrGx8ft1qCLrz7T+gzB+/HP97grrEsJXGdgSUZK6EQDfuBQBx+v3X2jSimvkL4PxDIf2DTUuz/ZDJpqX09RPyZL4P3+NM7/glmw90IPqXE5/NZLUEXoc8cvOvjvYs+7/4T+szBuz7eKOvGMhgMWi1BF6HPHLzr432met79J/SZg3d9vFHWjWVtba3VEnQR+szBuz673W61BF1495/QZw7e9fFGWTeWbrfbagm6CH3m4F2f3lBjPMC7/4Q+c/CujzfKurGMRCJWS9BF6DMH7/p472DBu/+EPnPwro83yrqxbGxstFqCLkKfOXjXt2jRIqsl6MK7/4Q+c/CujzfKurHk/cxe6DMH7/r0Xh3hAd79J/SZg3d9vFHWjeXQ0JDVEnQR+szBu76xsTGrJejCu/+EPnPwro83ynpQAr33jFLzwZkl35eLpfnwfDA7yIYZ+0Zko6+Y9o1wOHwYHrbOPqBff733LEX8Ga8j4s8YvfqL9yxzo6yvLHl/z8jnE/rMwLs+3t+z5N1/Qp85eD/+8UZZX1lmM0WSlWemQ0NOS+0D+vUPhZxob7fOvh5Ekv+stG/E/PnzLbVvhIi/uR1/eU0RV8aU9ZWly+XKb8NNm4DKSikiKyul30UgHtfQVyL7msj2XRdfbKl9o/pr+q9E9o2orq621L4RIv707R/t8Zf38a9csXrak2IvBZ/PcuPGI5nKJWNOuUJMEaQ6H14J7RvV/0W/31L7RvUvynyCBfR/XvNZivgT8Vcg/4v5LHNbSPLJ3OWMM85gHR0dqnmxWExzFIvUbYxZ7qmsBKamZm9gswGTk8bbZwkRUF8fQyyWoa+E9lW3V9iP1dfDnXruZoH9GajYV/VfCe2rbq/gpptuwve+9z3L7Osh4s/Y/gyOwvjTO/5JZVCQMXZGlpLnPGV9GzYWi+W+kVqg6qWbwO1W0VdC+0Z2Yso/mgX2jdJV/VdC+0bkNZ+giL/0VxF/WaTrkNfxr4wp68ZyZGQk941sttzSTeBwqOgroX0jOyPKsU0tsG+Uruq/Eto3YmJiwlL7Roj407dvlM57/OV1/CtjuGssiei/iSgkL1EiCsnpHiJKKvLuN2srr/eM1q/PLd0EwaCKvhLaN7LjU3Y9t8C+Ubqq/0po34i85rMU8Zf+KuIvi3QdxHuWOWL1Q1O9BcD3APyL/N0DoDPXMgrewYcx6WG6zSatYLPNerhuuH0W6HYQKJF9o/q/6Pdbat+o/kXpYJGD/aJ08CmgfT1E/M39+BMdfHJsj6wWoCkMIAC9AJbLvwveWG7btk0zT63DWT5LvgCMtbVts9S+0ZKNvmLaz0aflfaN6r9hwwZL7RvVX8Tf3I4/veOfpEE0lsqF50EJ1gIYYIz9TZF2EhFtBTAM4OuMsc1qGxLRegDrAWnOtkAggObmZkSjUSSTSfh8PgSDQRARuru70dfXh9bWVkQiEUxNTaGtrQ1+fwixmHSbzO3uRyjUjra2MCYnbYhEvGhr60RvbwPs9gksXTqIYNAHny+I0dFqRKMetLR0IRr1IBxOIB6Pp23W1tbC7XYjEomgsbER8XgcQ0ND6Xyn0wmXywW/vweJhAM+XwccjpF0+fG4C4mEAx5PFDt2NMPjiaKmJpnOHxiow8SEHcuW9SEcbsWrrx6pUygUSt/66+/vR3t7O8LhMGw2G7xeLzo7O9HQ0ICJiQn4/dp1cjgScLniGBiog98fQCJRi1jMjaamCHp6GuFyxeF0DiEY9CEQOFKnnp4eeL1exGIxjIyMpOvscrngcDgQjUbT+8nv166T1xtBZeUUwuE2tLdr76dDhxYgEAik6zQ4OJi2WV1dDY/Hg66uLng8HiQSM/eTz6ddJ58viKEhJ+JxFxobe7Brlxdud0x1PwUCUdXYq6urw/j4OAKBwKzYC4VC8HrNx57DkUAgkHvs9fT0oL7ei/r6GFyueN6x5/VGsHlz7rE3ODgIh0M/9oJBHxobe2C3j+vup1Ao99hLJpNp+/nGXiTiRWNjD7q7q3OOvdraWtTXm489jyeKgQH12LPb7fJ+rp8Ve3k9HigHrGihAbwAoFNluUSxzn0AblL8rgLgkr/7IF11LjSyle9tWB4Q+szBuz6927A8wLv/hD5ziNuwR8GVJWPsXL18IqoEcBmkRjG1zTiAcfl7kIh6AHgBqL9EmQXNzc35bloShD5z8K5v8eLFVkvQhXf/CX3m4F0fb3DXG1bmXAA7GWN9qQQiWkJENvn7yQCWA3jLjJFoNGpm86Ij9JmDd328T5HEu/+EPnPwro83eH1meSWAX2SkvQ/AN4hoEsAUgA2MsXfNGOF98l2hzxy865tUjLjCI7z7T+gzB+/6eIPLxpIx9imVtCcAPFFIO7y/ZyT0mYN3fbx3pODdf0KfOXjXxxu83oYtCbzP5yb0mYN3fbzPZ8m7/4Q+c/CujzfKurGsq6uzWoIuQp85eNe3YMECqyXowrv/hD5z8K6PN8q6sbTb7VZL0EXoMwfv+mylGs80T3j3n9BnDt718UZZN5Z9fX3GK1mI0GcO3vUNDw9bLUEX3v0n9JmDd328wWUHn1LR2tqqmZeaD84s0hgKuUMEuFytiMets29ENvqKad8Il6sV+/dbZx/Qr7/ebTARf8briPgzRq/+esc/wWzK+soyEolYLUEXr1foMwPv+uJmW6Iiw7v/hD5z8H78442yvrKcymLCVCvPTCsrpyy1D+jXf/PmKaxda519PYgk/1lp34jp6WlL7Rsh4m9ux182xz/BEcr6yrKtrS2/DTdtAiorU/8I6XcRCIc19JXIviay/baLL7bUvlH9Nf1XIvtGLF261FL7Roj407d/tMdf3se/csXqwWmLvRR8PsuNG5nqXDgZc8oVYoog1fnwSmjfqP4v+v2W2jeqf1HmEyyg//Oaz1LEn4i/AvlfDKSe22K5gGIveo3lzp07NfM0gy016WrmYrNlt32WAIx5vSr6SmjfqP47vV5L7RvVX9V/JbRvVP8vfOELltrXQ8Tf3I8/veOfVIZoLJVLWd+GzQut+/yluv8v7Av7wr6wb5X9MqasG8u8hhvTepG8CC+Yu90q+kpo38hOv9ttqX2jdFX/ldC+ESMjI5baN0LEn759o3Te44/34RZ5o6wby/b29tw3Wr8+t3QThELtlto3stMeCllq3yhd1X8ltG/EcccdZ6l9I0T86ds3Suc9/vI6/pUzVt8HLvai98zy5Zdf1szTvee/ceORZwc226yH64bbZwHA2Nq1GvpKZN+o/i+vXWupfaP6a/qvRPaN6v+pT33KUvt6iPib+/Gnd/yTyhDPLJWL5QKKveg1ln/5y18089Seoeez5AvA2Jo1f7HUvtGSjb5i2s9Gn5X2jer/mc98xlL7RvUX8Te340/v+CdpEI2lcinr27Ber9dqCbpEIkKfGXjX53K5rJagC+/+E/rMwfvxjzfKurHs7OzUzCvUuV2+MAb86ledlto3WrLRV0z72eiz0r5R/QcHBy21b1R/EX9zO/70jn+C2VjSWBLRFUS0nYimieiMjLxbiaibiHYR0d8r0n1EFJbzfkhkfkCrhoYGs0UUFaHPHLzrW7hwodUSdOHdf0KfOXjXxxtWXVl2ArgMwMvKRCJqAXAlgJUAzgPwIyJK9Ym+D8B6AMvl5TyzIiYmJswWUVSEPnPwro/3sTl595/QZw7e9fGGJY0lY6yLMbZLJesSAL9kjI0zxnYD6AawmojqASxkjP1VfvD8CIBLzerQuw3GA0KfOXjXd+jQIasl6MK7/4Q+c/Cujzd4m3XkeABbFL/75LTD8vfMdFWIaD2kq1C43W4EAgE0NzcjGo0imUzC5/MhGAzC4XCgu7sbfX19aG1tRSQSwdTUFNra2hAKhVBfXw9Aenm3vb0d4XAYNpsNXq8XnZ2daGhowMTEBAYHB9NlVldXw+PxoKurCx6PB4lEAvF4PJ1fW1sLt9uNSCSCxsZGxONxDA0NpfOdTidcLhd6enrQ0NCAjo4OjIyMpPNdLhccDgei0ahqnerq6mC320tSp6amJgQCgZzq5PV6EYvFSlKnk046CYFAoOj7Kd86VVdXIxAIcBl7Xq8X8+bNQyAQ4DL2fD4fxsfH0dHRwWXseb1ejI+Po7u7m8vYs9vtGB8fx/79+zXrJMigWN1sAbwA6XZr5nKJYp0AgDMUv+8F8EnF7wcBXA7gTAAvKNLXAvh9NjryHUidB4Q+c/CuT28gdR7g3X9CnznEQOq5LUW7smSMnZvHZn0Alil+NwCIyekNKummqK6uNltEURH6zMG7vspK3m7szIR3/wl95uBdH2/w9urI7wBcSURVRHQSpI48/8cY6weQIKL3yr1grwXwW7PGPB6P2SKKitBnDt71OZ1OqyXowrv/hD5z8K6PN6x6deQjRNQHYA2Ap4noWQBgjG0H8D8AdgB4BsAXGGOpLoMbAfwUUqefHgB/NKujq6vLbBFFRegzB+/69u/fb7UEXXj3n9BnDt718QYxozdXj3KIaB+APRrZiwHwfMQS+swh9JlD6DPH0a7vRMbYklKJ4Z0531jqQUQdjLEzjNe0BqHPHEKfOYQ+cwh9cwvenlkKBAKBQMAdorEUCAQCgcCAcm8sf2y1AAOEPnMIfeYQ+swh9M0hyvqZpUAgEAgE2VDuV5YCgUAgEBgiGkuBQCAQCAwoi8aSl/kzc9D730QUkpcoEYXkdA8RJRV595dKU4a+24noHYWOCxR5qv4ssb7vENFOItpGRL8hIqeczoX/ZC3nyT7qJqJbrNKh0LOMiF4koi75v/IlOV1zX1ugMSr/J0NE1CGnHUtEzxPR3+TPRRZpa1L4KEREw0R0g5X+I6KHiGiQiDoVaZr+4uG/yzVWD05bigVAM4AmzB64vQXAmwCqAJwEaWQgm5z3f5BGGCJIowWdb5H27wH4F/m7B0AnB/68HcDNKuma/iyxvg8DqJS/fxvAtznzn032zckA7LLPWizWVA/gdPm7A0BE3p+q+9oijVEAizPS7gJwi/z9ltS+5mD/7gVwopX+A/A+AKcrY17LX7z8d3leyuLKknEyf2auyFezHwPwi1LbzhNVf5ZaBGPsOcbYpPxzC2YOws8DqwF0M8beYoxNAPglJN9ZBmOsnzH2hvw9AaALOtPgccQlAH4mf/8ZLPifqvBBAD2MMa2Rw0oCY+xlAO9mJGv5i4v/Ls+URWOpw/EAehW/U/NkHo8c5s8sImsBDDDG/qZIO4mIthLRS0S01gJNKa6Xb3M+pLiVo+VPK/kMZo4jzIP/ePRTGiLyADgNwGtyktq+tgIG4DkiCpI0Zy0ALGXSRAuQP+ssU3eEKzHzBJcX/wHa/uI6JnlgzjSWRPQCEXWqLHpn7GrPIZlOesHIUu8nMPNP1w/gBMbYaQC+DODnRLSwkLqy1HcfgEYA7bKm76U2UymqKO8mZeM/IroNwCSAx+WkkvnPgJL5KVeIqBbAEwBuYIwNQ3tfW8HfMcZOB3A+gC8Q0fss1KIKEdkBXAzgf+UknvynB7cxyQt8T6iXA+womD9TiZFeIqoEcBkAn2KbcQDj8vcgEfUA8ALoKKS2bPQpdP4EwFPyTy1/Fpws/HcdgAsBfFC+lV5S/xlQMj/lAhHNg9RQPs4Y+zUAMMYGFPnKfV1yGGMx+XOQiH4D6TbhABHVM8b65ccng1bpkzkfwBspv/HkPxktf3EZkzwxZ64s86Sk82fmyLkAdjLG0reDiWgJEdnk7yfLet8qsS7If7IUHwGQ6m2n6k8L9J0H4KsALmaMjSrSufAfgNcBLCeik+QrkSsh+c4y5Dh/EEAXY+xuRbrWvi4pRLSAiByp75A6cXVC8tt18mrXofT/00xm3A3ixX8KtPzFxX+Xa6zuYVSKBVKQ9kG6qhgA8Kwi7zZIPb92QdHjFcAZkAK7B8B/Qh7tqISaHwawISPtcgDbIfVaewPARRb581EAYQDbIP3J6o38WWJ93ZCev4Tk5X6e/CdruQBSj9MeALdZpUOh52xIt922Kfx2gd6+LrG+k+X99qa8D2+T010A/gTgb/LnsRb6sAZAHMAxijTL/Aep0e4HcFg+/q3T8xcP/12eFzHcnUAgEAgEBpT7bViBQCAQCAwRjaVAIBAIBAaIxlIgEAgEAgNEYykQCAQCgQGisRQIBAKBwADRWAoEJiBpto7dRHSs/HuR/PtEk+W+WhiFAoGgEIhXRwQCkxDRPwE4hTG2nogeABBljN1ptS6BQFA4xJWlQGCe7wN4LxHdAOnl/lnjfxLRk/IA4NtTg4AT0YnyvIKLiaiCiDYT0YflvBH5s56IXiZpLsROiwfPFwjKFnFlKRAUAHmy3GcAfJgx9rxK/rGMsXeJqBrScHfvZ4zFieizAM6DNMPHKYyxz8vrjzDGaonoJgDzGWN3yEP11TBpCi2BQFBCxJWlQFAYzoc0tFirRv4XiehNSPNrLoM09iYYYz+FNNnyBgA3q2z3OoBPE9HtANpEQykQWINoLAUCkxBRO4APAXgvgBvlTj8hedlARH5IA+OvYYytArAVwHx52xocmeGmNrNsJk3g+z4A7wB4lIiuLXJ1BAKBCnNmii6BwArk2TrugzT/49tE9B0A/84Ya1escwmAA4yxUSJaAalRTfFtSPNt7gHwE0jTiinLPxHAO4yxn8izbZwO4JFi1kkgEMxGXFkKBOb4HIC3Fc8pfwRgBRG9X7HOMwAqiWgbgP8H6VYs5HXOBPBtxtjjACaI6NMZ5fsBhIhoK6RZU35QtJoIBAJNRAcfgUAgEAgMEFeWAoFAIBAYIBpLgUAgEAgMEI2lQCAQCAQGiMZSIBAIBAIDRGMpEAgEAoEBorEUCAQCgcAA0VgKBAKBQGDA/wfw3YQJMeMqAgAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "from nanoid import generate\n",
    "import json\n",
    "\n",
    "lod0_data = {\n",
    "    \"scene\": {\n",
    "        \"name\": \"scene1\",\n",
    "        \"lodsetting\": {\n",
    "            \"lodmax\": {\n",
    "                \"distance\": 60,\n",
    "                \"name\": \"building\"\n",
    "            }\n",
    "        },\n",
    "        \"default_camera\": [\n",
    "            {\n",
    "                \"id\": \"01\",\n",
    "                \"view_direction\": {\n",
    "                    \"x\": 0,\n",
    "                    \"y\": 0,\n",
    "                    \"z\": 0\n",
    "                },\n",
    "                \"position\": {\n",
    "                    \"x\": 277,\n",
    "                    \"y\": 449,\n",
    "                    \"z\": 835\n",
    "                },\n",
    "                \"pov\": 55,\n",
    "                \"depth\": 50000\n",
    "            }\n",
    "        ],\n",
    "        \"children\": [],\n",
    "        \"default_background\": {\n",
    "            \"color\": \"#c2d2eb\",\n",
    "            \"colorAlpha\": 1,\n",
    "            \"ambientLight\": \"0xdddddd\",\n",
    "            \"sunlight\": {\n",
    "                            \"color\": \"0xdddddd\",\n",
    "                            \"denity\": 0.8,\n",
    "                            \"direction\": {\n",
    "                                \"x\": 1,\n",
    "                                \"y\": 1,\n",
    "                                \"z\": 2\n",
    "                            },\n",
    "                \"position\": {\n",
    "                                \"x\": 1000,\n",
    "                                \"y\": 1000,\n",
    "                                \"z\": 1000\n",
    "                            }\n",
    "            },\n",
    "            \"weather\": \"sunny\",\n",
    "            \"shadow\": \"true\"\n",
    "        }\n",
    "    }\n",
    "}\n",
    "\n",
    "\n",
    "def calculate_block_centers(a, b, block_width, block_height):\n",
    "    distance = 10\n",
    "\n",
    "    # 计算中心点的坐标\n",
    "    centers = []\n",
    "    for i in range(a):\n",
    "        for j in range(b):\n",
    "            x = (i - (a - 1) / 2) * (block_width + distance)\n",
    "            y = (j - (b - 1) / 2) * (block_height + distance)\n",
    "            centers.append((x, y))\n",
    "\n",
    "    return centers\n",
    "\n",
    "# 例如，横向有3个方块，纵向有2个方块，方块的长为15，宽为10\n",
    "a = 10\n",
    "b = 10\n",
    "block_width = 10\n",
    "block_height = 10\n",
    "\n",
    "centers = calculate_block_centers(a, b, block_width, block_height)\n",
    "\n",
    "# 打印方块中心点坐标\n",
    "print(\"Block Centers:\")\n",
    "for center in centers:\n",
    "    center_x, center_y = center\n",
    "    data = {\n",
    "        \"id\": generate(size=8),\n",
    "        \"name\": f\"lodmax\",\n",
    "        \"lod\": f\"lodmax\",\n",
    "        \"position\": {\"x\": center_x, \"y\": 0, \"z\": center_y},\n",
    "        \"rotation\": {\"x\": 0, \"y\": 0, \"z\": 0},\n",
    "        \"model_3d\": [\n",
    "            {\n",
    "                \"model_url\": f\"lodmax.obj\",\n",
    "                \"material_url\": f\"lodmax.mtl\",\n",
    "                \"texture_url\": \"\",\n",
    "                \"shader_url\": \"\"\n",
    "            }\n",
    "        ],\n",
    "        \"children\": []\n",
    "    }\n",
    "    lod0_data[\"scene\"][\"children\"].append(data)\n",
    "\n",
    "#print(lod0_data)\n",
    "# 将lod0数据保存为json文件\n",
    "with open(\"testData.json\", \"w\") as f:\n",
    "    json.dump(lod0_data, f, indent=4)\n",
    "print(\"生成的JSON文件已保存为testData.json\")\n",
    "\n",
    "\n",
    "# 绘制方块中心点\n",
    "x_centers, y_centers = zip(*centers)\n",
    "plt.scatter(x_centers, y_centers, marker='o',\n",
    "            color='red', label='Block Centers')\n",
    "\n",
    "# 绘制方块中心点\n",
    "x_centers, y_centers = zip(*centers)\n",
    "plt.scatter(x_centers, y_centers, marker='o', color='red', label='Block Centers')\n",
    "\n",
    "# 绘制方块\n",
    "for center in centers:\n",
    "    x, y = center\n",
    "    plt.Rectangle((x - block_width / 2, y - block_height / 2), block_width, block_height, fill=None, edgecolor='blue', linewidth=2)\n",
    "    plt.gca().add_patch(plt.Rectangle((x - block_width / 2, y - block_height / 2), block_width, block_height, fill=None, edgecolor='blue', linewidth=2))\n",
    "\n",
    "plt.axhline(0, color='black',linewidth=0.5)\n",
    "plt.axvline(0, color='black',linewidth=0.5)\n",
    "plt.grid(color = 'gray', linestyle = '--', linewidth = 0.5)\n",
    "\n",
    "plt.xlabel('X-axis')\n",
    "plt.ylabel('Y-axis')\n",
    "plt.title(f'Block Arrangement ({a}x{b}) with Block Size ({block_width}x{block_height})')\n",
    "\n",
    "# 调整图例大小\n",
    "plt.legend(loc='upper right', bbox_to_anchor=(1.2, 1), title='Legend')\n",
    "\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0\n",
      "0\n",
      "8\n",
      "8\n",
      "10\n",
      "10\n",
      "1\n",
      "0\n",
      "3\n",
      "4\n",
      "50\n",
      "30\n",
      "发生错误: index 8 is out of bounds for axis 0 with size 8\n",
      "发生错误: index 8 is out of bounds for axis 0 with size 8\n",
      "发生错误: index 8 is out of bounds for axis 0 with size 8\n",
      "发生错误: index 8 is out of bounds for axis 0 with size 8\n",
      "发生错误: index 8 is out of bounds for axis 0 with size 8\n",
      "发生错误: index 8 is out of bounds for axis 0 with size 8\n",
      "发生错误: index 8 is out of bounds for axis 0 with size 8\n",
      "发生错误: index 8 is out of bounds for axis 0 with size 8\n",
      "生成的JSON文件已保存为testData2.json\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "{'scene': {'name': 'scene1',\n",
       "  'lodsetting': {'lod1': {'distance': 1000, 'name': 'building'},\n",
       "   'lod2': {'distance': 900, 'name': 'building'},\n",
       "   'lod3': {'distance': 800, 'name': 'building'}},\n",
       "  'default_camera': [{'id': '01',\n",
       "    'view_direction': {'x': 0, 'y': 0, 'z': 0},\n",
       "    'position': {'x': 277, 'y': 449, 'z': 835},\n",
       "    'pov': 55,\n",
       "    'depth': 50000}],\n",
       "  'children': [{'id': 'BjhkokYm',\n",
       "    'name': 'lod1',\n",
       "    'lod': 'lod1',\n",
       "    'position': {'x': -50.0, 'y': 0, 'z': -60.0},\n",
       "    'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "    'model_3d': [{'model_url': 'lod1.obj',\n",
       "      'material_url': 'lod1.mtl',\n",
       "      'texture_url': '',\n",
       "      'shader_url': ''}],\n",
       "    'children': [{'id': 'VGO5LkXj',\n",
       "      'name': 'lod2',\n",
       "      'lod': 'lod2',\n",
       "      'position': {'x': -70.0, 'y': 0, 'z': -70.0},\n",
       "      'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "      'model_3d': [{'model_url': 'lod2.obj',\n",
       "        'material_url': 'lod2.mtl',\n",
       "        'texture_url': '',\n",
       "        'shader_url': ''}],\n",
       "      'children': []},\n",
       "     {'id': 'k5w2Xaxn',\n",
       "      'name': 'lod2',\n",
       "      'lod': 'lod2',\n",
       "      'position': {'x': -70.0, 'y': 0, 'z': -50.0},\n",
       "      'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "      'model_3d': [{'model_url': 'lod2.obj',\n",
       "        'material_url': 'lod2.mtl',\n",
       "        'texture_url': '',\n",
       "        'shader_url': ''}],\n",
       "      'children': []},\n",
       "     {'id': 'SW4-RLD9',\n",
       "      'name': 'lod2',\n",
       "      'lod': 'lod2',\n",
       "      'position': {'x': -50.0, 'y': 0, 'z': -70.0},\n",
       "      'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "      'model_3d': [{'model_url': 'lod2.obj',\n",
       "        'material_url': 'lod2.mtl',\n",
       "        'texture_url': '',\n",
       "        'shader_url': ''}],\n",
       "      'children': []},\n",
       "     {'id': 'b75oVfLh',\n",
       "      'name': 'lod2',\n",
       "      'lod': 'lod2',\n",
       "      'position': {'x': -50.0, 'y': 0, 'z': -50.0},\n",
       "      'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "      'model_3d': [{'model_url': 'lod2.obj',\n",
       "        'material_url': 'lod2.mtl',\n",
       "        'texture_url': '',\n",
       "        'shader_url': ''}],\n",
       "      'children': []},\n",
       "     {'id': 'rKea9mmM',\n",
       "      'name': 'lod2',\n",
       "      'lod': 'lod2',\n",
       "      'position': {'x': -30.0, 'y': 0, 'z': -70.0},\n",
       "      'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "      'model_3d': [{'model_url': 'lod2.obj',\n",
       "        'material_url': 'lod2.mtl',\n",
       "        'texture_url': '',\n",
       "        'shader_url': ''}],\n",
       "      'children': []},\n",
       "     {'id': '2GBibY5L',\n",
       "      'name': 'lod2',\n",
       "      'lod': 'lod2',\n",
       "      'position': {'x': -30.0, 'y': 0, 'z': -50.0},\n",
       "      'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "      'model_3d': [{'model_url': 'lod2.obj',\n",
       "        'material_url': 'lod2.mtl',\n",
       "        'texture_url': '',\n",
       "        'shader_url': ''}],\n",
       "      'children': []}]},\n",
       "   {'id': 'Tw2-X6t-',\n",
       "    'name': 'lod1',\n",
       "    'lod': 'lod1',\n",
       "    'position': {'x': -50.0, 'y': 0, 'z': -20.0},\n",
       "    'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "    'model_3d': [{'model_url': 'lod1.obj',\n",
       "      'material_url': 'lod1.mtl',\n",
       "      'texture_url': '',\n",
       "      'shader_url': ''}],\n",
       "    'children': [{'id': 'Y-jnvKvS',\n",
       "      'name': 'lod2',\n",
       "      'lod': 'lod2',\n",
       "      'position': {'x': -70.0, 'y': 0, 'z': -30.0},\n",
       "      'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "      'model_3d': [{'model_url': 'lod2.obj',\n",
       "        'material_url': 'lod2.mtl',\n",
       "        'texture_url': '',\n",
       "        'shader_url': ''}],\n",
       "      'children': []},\n",
       "     {'id': 'PVZjUBYA',\n",
       "      'name': 'lod2',\n",
       "      'lod': 'lod2',\n",
       "      'position': {'x': -70.0, 'y': 0, 'z': -10.0},\n",
       "      'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "      'model_3d': [{'model_url': 'lod2.obj',\n",
       "        'material_url': 'lod2.mtl',\n",
       "        'texture_url': '',\n",
       "        'shader_url': ''}],\n",
       "      'children': []},\n",
       "     {'id': 'WbO04FNW',\n",
       "      'name': 'lod2',\n",
       "      'lod': 'lod2',\n",
       "      'position': {'x': -50.0, 'y': 0, 'z': -30.0},\n",
       "      'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "      'model_3d': [{'model_url': 'lod2.obj',\n",
       "        'material_url': 'lod2.mtl',\n",
       "        'texture_url': '',\n",
       "        'shader_url': ''}],\n",
       "      'children': []},\n",
       "     {'id': 'jtDP2aek',\n",
       "      'name': 'lod2',\n",
       "      'lod': 'lod2',\n",
       "      'position': {'x': -50.0, 'y': 0, 'z': -10.0},\n",
       "      'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "      'model_3d': [{'model_url': 'lod2.obj',\n",
       "        'material_url': 'lod2.mtl',\n",
       "        'texture_url': '',\n",
       "        'shader_url': ''}],\n",
       "      'children': []},\n",
       "     {'id': 't3euyp7b',\n",
       "      'name': 'lod2',\n",
       "      'lod': 'lod2',\n",
       "      'position': {'x': -30.0, 'y': 0, 'z': -30.0},\n",
       "      'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "      'model_3d': [{'model_url': 'lod2.obj',\n",
       "        'material_url': 'lod2.mtl',\n",
       "        'texture_url': '',\n",
       "        'shader_url': ''}],\n",
       "      'children': []},\n",
       "     {'id': '5x7Pc-uH',\n",
       "      'name': 'lod2',\n",
       "      'lod': 'lod2',\n",
       "      'position': {'x': -30.0, 'y': 0, 'z': -10.0},\n",
       "      'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "      'model_3d': [{'model_url': 'lod2.obj',\n",
       "        'material_url': 'lod2.mtl',\n",
       "        'texture_url': '',\n",
       "        'shader_url': ''}],\n",
       "      'children': []}]},\n",
       "   {'id': 'p_EQl5s5',\n",
       "    'name': 'lod1',\n",
       "    'lod': 'lod1',\n",
       "    'position': {'x': -50.0, 'y': 0, 'z': 20.0},\n",
       "    'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "    'model_3d': [{'model_url': 'lod1.obj',\n",
       "      'material_url': 'lod1.mtl',\n",
       "      'texture_url': '',\n",
       "      'shader_url': ''}],\n",
       "    'children': [{'id': 'tqEpjttk',\n",
       "      'name': 'lod2',\n",
       "      'lod': 'lod2',\n",
       "      'position': {'x': -70.0, 'y': 0, 'z': 10.0},\n",
       "      'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "      'model_3d': [{'model_url': 'lod2.obj',\n",
       "        'material_url': 'lod2.mtl',\n",
       "        'texture_url': '',\n",
       "        'shader_url': ''}],\n",
       "      'children': []},\n",
       "     {'id': 'o5lYjXLp',\n",
       "      'name': 'lod2',\n",
       "      'lod': 'lod2',\n",
       "      'position': {'x': -70.0, 'y': 0, 'z': 30.0},\n",
       "      'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "      'model_3d': [{'model_url': 'lod2.obj',\n",
       "        'material_url': 'lod2.mtl',\n",
       "        'texture_url': '',\n",
       "        'shader_url': ''}],\n",
       "      'children': []},\n",
       "     {'id': 'y_z-ExEp',\n",
       "      'name': 'lod2',\n",
       "      'lod': 'lod2',\n",
       "      'position': {'x': -50.0, 'y': 0, 'z': 10.0},\n",
       "      'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "      'model_3d': [{'model_url': 'lod2.obj',\n",
       "        'material_url': 'lod2.mtl',\n",
       "        'texture_url': '',\n",
       "        'shader_url': ''}],\n",
       "      'children': []},\n",
       "     {'id': 'ZGgrDVOE',\n",
       "      'name': 'lod2',\n",
       "      'lod': 'lod2',\n",
       "      'position': {'x': -50.0, 'y': 0, 'z': 30.0},\n",
       "      'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "      'model_3d': [{'model_url': 'lod2.obj',\n",
       "        'material_url': 'lod2.mtl',\n",
       "        'texture_url': '',\n",
       "        'shader_url': ''}],\n",
       "      'children': []},\n",
       "     {'id': 'JF3bgPC1',\n",
       "      'name': 'lod2',\n",
       "      'lod': 'lod2',\n",
       "      'position': {'x': -30.0, 'y': 0, 'z': 10.0},\n",
       "      'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "      'model_3d': [{'model_url': 'lod2.obj',\n",
       "        'material_url': 'lod2.mtl',\n",
       "        'texture_url': '',\n",
       "        'shader_url': ''}],\n",
       "      'children': []},\n",
       "     {'id': 'JQpEJR2t',\n",
       "      'name': 'lod2',\n",
       "      'lod': 'lod2',\n",
       "      'position': {'x': -30.0, 'y': 0, 'z': 30.0},\n",
       "      'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "      'model_3d': [{'model_url': 'lod2.obj',\n",
       "        'material_url': 'lod2.mtl',\n",
       "        'texture_url': '',\n",
       "        'shader_url': ''}],\n",
       "      'children': []}]},\n",
       "   {'id': 'WZGOkzlj',\n",
       "    'name': 'lod1',\n",
       "    'lod': 'lod1',\n",
       "    'position': {'x': -50.0, 'y': 0, 'z': 60.0},\n",
       "    'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "    'model_3d': [{'model_url': 'lod1.obj',\n",
       "      'material_url': 'lod1.mtl',\n",
       "      'texture_url': '',\n",
       "      'shader_url': ''}],\n",
       "    'children': [{'id': 'm5aHJz0b',\n",
       "      'name': 'lod2',\n",
       "      'lod': 'lod2',\n",
       "      'position': {'x': -70.0, 'y': 0, 'z': 50.0},\n",
       "      'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "      'model_3d': [{'model_url': 'lod2.obj',\n",
       "        'material_url': 'lod2.mtl',\n",
       "        'texture_url': '',\n",
       "        'shader_url': ''}],\n",
       "      'children': []},\n",
       "     {'id': 'gFEdjCwL',\n",
       "      'name': 'lod2',\n",
       "      'lod': 'lod2',\n",
       "      'position': {'x': -70.0, 'y': 0, 'z': 70.0},\n",
       "      'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "      'model_3d': [{'model_url': 'lod2.obj',\n",
       "        'material_url': 'lod2.mtl',\n",
       "        'texture_url': '',\n",
       "        'shader_url': ''}],\n",
       "      'children': []},\n",
       "     {'id': 'IU25Bp24',\n",
       "      'name': 'lod2',\n",
       "      'lod': 'lod2',\n",
       "      'position': {'x': -50.0, 'y': 0, 'z': 50.0},\n",
       "      'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "      'model_3d': [{'model_url': 'lod2.obj',\n",
       "        'material_url': 'lod2.mtl',\n",
       "        'texture_url': '',\n",
       "        'shader_url': ''}],\n",
       "      'children': []},\n",
       "     {'id': 'ki9-p6Ng',\n",
       "      'name': 'lod2',\n",
       "      'lod': 'lod2',\n",
       "      'position': {'x': -50.0, 'y': 0, 'z': 70.0},\n",
       "      'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "      'model_3d': [{'model_url': 'lod2.obj',\n",
       "        'material_url': 'lod2.mtl',\n",
       "        'texture_url': '',\n",
       "        'shader_url': ''}],\n",
       "      'children': []},\n",
       "     {'id': 'GVefu6xj',\n",
       "      'name': 'lod2',\n",
       "      'lod': 'lod2',\n",
       "      'position': {'x': -30.0, 'y': 0, 'z': 50.0},\n",
       "      'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "      'model_3d': [{'model_url': 'lod2.obj',\n",
       "        'material_url': 'lod2.mtl',\n",
       "        'texture_url': '',\n",
       "        'shader_url': ''}],\n",
       "      'children': []},\n",
       "     {'id': 'S4RpogWz',\n",
       "      'name': 'lod2',\n",
       "      'lod': 'lod2',\n",
       "      'position': {'x': -30.0, 'y': 0, 'z': 70.0},\n",
       "      'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "      'model_3d': [{'model_url': 'lod2.obj',\n",
       "        'material_url': 'lod2.mtl',\n",
       "        'texture_url': '',\n",
       "        'shader_url': ''}],\n",
       "      'children': []}]},\n",
       "   {'id': 'h1j_-f8Y',\n",
       "    'name': 'lod1',\n",
       "    'lod': 'lod1',\n",
       "    'position': {'x': 10.0, 'y': 0, 'z': -60.0},\n",
       "    'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "    'model_3d': [{'model_url': 'lod1.obj',\n",
       "      'material_url': 'lod1.mtl',\n",
       "      'texture_url': '',\n",
       "      'shader_url': ''}],\n",
       "    'children': [{'id': '7qvts9Nj',\n",
       "      'name': 'lod2',\n",
       "      'lod': 'lod2',\n",
       "      'position': {'x': -10.0, 'y': 0, 'z': -70.0},\n",
       "      'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "      'model_3d': [{'model_url': 'lod2.obj',\n",
       "        'material_url': 'lod2.mtl',\n",
       "        'texture_url': '',\n",
       "        'shader_url': ''}],\n",
       "      'children': []},\n",
       "     {'id': 'ASjkD8zp',\n",
       "      'name': 'lod2',\n",
       "      'lod': 'lod2',\n",
       "      'position': {'x': -10.0, 'y': 0, 'z': -50.0},\n",
       "      'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "      'model_3d': [{'model_url': 'lod2.obj',\n",
       "        'material_url': 'lod2.mtl',\n",
       "        'texture_url': '',\n",
       "        'shader_url': ''}],\n",
       "      'children': []},\n",
       "     {'id': 'r31E6wKm',\n",
       "      'name': 'lod2',\n",
       "      'lod': 'lod2',\n",
       "      'position': {'x': 10.0, 'y': 0, 'z': -70.0},\n",
       "      'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "      'model_3d': [{'model_url': 'lod2.obj',\n",
       "        'material_url': 'lod2.mtl',\n",
       "        'texture_url': '',\n",
       "        'shader_url': ''}],\n",
       "      'children': []},\n",
       "     {'id': 'LW5NuGf8',\n",
       "      'name': 'lod2',\n",
       "      'lod': 'lod2',\n",
       "      'position': {'x': 10.0, 'y': 0, 'z': -50.0},\n",
       "      'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "      'model_3d': [{'model_url': 'lod2.obj',\n",
       "        'material_url': 'lod2.mtl',\n",
       "        'texture_url': '',\n",
       "        'shader_url': ''}],\n",
       "      'children': []},\n",
       "     {'id': '0afPV5c0',\n",
       "      'name': 'lod2',\n",
       "      'lod': 'lod2',\n",
       "      'position': {'x': 30.0, 'y': 0, 'z': -70.0},\n",
       "      'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "      'model_3d': [{'model_url': 'lod2.obj',\n",
       "        'material_url': 'lod2.mtl',\n",
       "        'texture_url': '',\n",
       "        'shader_url': ''}],\n",
       "      'children': []},\n",
       "     {'id': 'WDFY4t1-',\n",
       "      'name': 'lod2',\n",
       "      'lod': 'lod2',\n",
       "      'position': {'x': 30.0, 'y': 0, 'z': -50.0},\n",
       "      'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "      'model_3d': [{'model_url': 'lod2.obj',\n",
       "        'material_url': 'lod2.mtl',\n",
       "        'texture_url': '',\n",
       "        'shader_url': ''}],\n",
       "      'children': []}]},\n",
       "   {'id': '9q1koYBr',\n",
       "    'name': 'lod1',\n",
       "    'lod': 'lod1',\n",
       "    'position': {'x': 10.0, 'y': 0, 'z': -20.0},\n",
       "    'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "    'model_3d': [{'model_url': 'lod1.obj',\n",
       "      'material_url': 'lod1.mtl',\n",
       "      'texture_url': '',\n",
       "      'shader_url': ''}],\n",
       "    'children': [{'id': '666uQJc3',\n",
       "      'name': 'lod2',\n",
       "      'lod': 'lod2',\n",
       "      'position': {'x': -10.0, 'y': 0, 'z': -30.0},\n",
       "      'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "      'model_3d': [{'model_url': 'lod2.obj',\n",
       "        'material_url': 'lod2.mtl',\n",
       "        'texture_url': '',\n",
       "        'shader_url': ''}],\n",
       "      'children': []},\n",
       "     {'id': 'e82huFym',\n",
       "      'name': 'lod2',\n",
       "      'lod': 'lod2',\n",
       "      'position': {'x': -10.0, 'y': 0, 'z': -10.0},\n",
       "      'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "      'model_3d': [{'model_url': 'lod2.obj',\n",
       "        'material_url': 'lod2.mtl',\n",
       "        'texture_url': '',\n",
       "        'shader_url': ''}],\n",
       "      'children': []},\n",
       "     {'id': '5S62husz',\n",
       "      'name': 'lod2',\n",
       "      'lod': 'lod2',\n",
       "      'position': {'x': 10.0, 'y': 0, 'z': -30.0},\n",
       "      'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "      'model_3d': [{'model_url': 'lod2.obj',\n",
       "        'material_url': 'lod2.mtl',\n",
       "        'texture_url': '',\n",
       "        'shader_url': ''}],\n",
       "      'children': []},\n",
       "     {'id': 'iCmQ9ILP',\n",
       "      'name': 'lod2',\n",
       "      'lod': 'lod2',\n",
       "      'position': {'x': 10.0, 'y': 0, 'z': -10.0},\n",
       "      'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "      'model_3d': [{'model_url': 'lod2.obj',\n",
       "        'material_url': 'lod2.mtl',\n",
       "        'texture_url': '',\n",
       "        'shader_url': ''}],\n",
       "      'children': []},\n",
       "     {'id': 't-kzOpXl',\n",
       "      'name': 'lod2',\n",
       "      'lod': 'lod2',\n",
       "      'position': {'x': 30.0, 'y': 0, 'z': -30.0},\n",
       "      'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "      'model_3d': [{'model_url': 'lod2.obj',\n",
       "        'material_url': 'lod2.mtl',\n",
       "        'texture_url': '',\n",
       "        'shader_url': ''}],\n",
       "      'children': []},\n",
       "     {'id': 'bfR83TF6',\n",
       "      'name': 'lod2',\n",
       "      'lod': 'lod2',\n",
       "      'position': {'x': 30.0, 'y': 0, 'z': -10.0},\n",
       "      'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "      'model_3d': [{'model_url': 'lod2.obj',\n",
       "        'material_url': 'lod2.mtl',\n",
       "        'texture_url': '',\n",
       "        'shader_url': ''}],\n",
       "      'children': []}]},\n",
       "   {'id': 'UdeBZPRT',\n",
       "    'name': 'lod1',\n",
       "    'lod': 'lod1',\n",
       "    'position': {'x': 10.0, 'y': 0, 'z': 20.0},\n",
       "    'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "    'model_3d': [{'model_url': 'lod1.obj',\n",
       "      'material_url': 'lod1.mtl',\n",
       "      'texture_url': '',\n",
       "      'shader_url': ''}],\n",
       "    'children': [{'id': '58bDNbCT',\n",
       "      'name': 'lod2',\n",
       "      'lod': 'lod2',\n",
       "      'position': {'x': -10.0, 'y': 0, 'z': 10.0},\n",
       "      'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "      'model_3d': [{'model_url': 'lod2.obj',\n",
       "        'material_url': 'lod2.mtl',\n",
       "        'texture_url': '',\n",
       "        'shader_url': ''}],\n",
       "      'children': []},\n",
       "     {'id': 'P2gGfaQu',\n",
       "      'name': 'lod2',\n",
       "      'lod': 'lod2',\n",
       "      'position': {'x': -10.0, 'y': 0, 'z': 30.0},\n",
       "      'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "      'model_3d': [{'model_url': 'lod2.obj',\n",
       "        'material_url': 'lod2.mtl',\n",
       "        'texture_url': '',\n",
       "        'shader_url': ''}],\n",
       "      'children': []},\n",
       "     {'id': 'DHwJzgaa',\n",
       "      'name': 'lod2',\n",
       "      'lod': 'lod2',\n",
       "      'position': {'x': 10.0, 'y': 0, 'z': 10.0},\n",
       "      'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "      'model_3d': [{'model_url': 'lod2.obj',\n",
       "        'material_url': 'lod2.mtl',\n",
       "        'texture_url': '',\n",
       "        'shader_url': ''}],\n",
       "      'children': []},\n",
       "     {'id': 'qOtEewFO',\n",
       "      'name': 'lod2',\n",
       "      'lod': 'lod2',\n",
       "      'position': {'x': 10.0, 'y': 0, 'z': 30.0},\n",
       "      'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "      'model_3d': [{'model_url': 'lod2.obj',\n",
       "        'material_url': 'lod2.mtl',\n",
       "        'texture_url': '',\n",
       "        'shader_url': ''}],\n",
       "      'children': []},\n",
       "     {'id': 'lFsxdXnR',\n",
       "      'name': 'lod2',\n",
       "      'lod': 'lod2',\n",
       "      'position': {'x': 30.0, 'y': 0, 'z': 10.0},\n",
       "      'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "      'model_3d': [{'model_url': 'lod2.obj',\n",
       "        'material_url': 'lod2.mtl',\n",
       "        'texture_url': '',\n",
       "        'shader_url': ''}],\n",
       "      'children': []},\n",
       "     {'id': 'NVx7p17k',\n",
       "      'name': 'lod2',\n",
       "      'lod': 'lod2',\n",
       "      'position': {'x': 30.0, 'y': 0, 'z': 30.0},\n",
       "      'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "      'model_3d': [{'model_url': 'lod2.obj',\n",
       "        'material_url': 'lod2.mtl',\n",
       "        'texture_url': '',\n",
       "        'shader_url': ''}],\n",
       "      'children': []}]},\n",
       "   {'id': 'n5ta7Tdv',\n",
       "    'name': 'lod1',\n",
       "    'lod': 'lod1',\n",
       "    'position': {'x': 10.0, 'y': 0, 'z': 60.0},\n",
       "    'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "    'model_3d': [{'model_url': 'lod1.obj',\n",
       "      'material_url': 'lod1.mtl',\n",
       "      'texture_url': '',\n",
       "      'shader_url': ''}],\n",
       "    'children': [{'id': '5a7qlGTW',\n",
       "      'name': 'lod2',\n",
       "      'lod': 'lod2',\n",
       "      'position': {'x': -10.0, 'y': 0, 'z': 50.0},\n",
       "      'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "      'model_3d': [{'model_url': 'lod2.obj',\n",
       "        'material_url': 'lod2.mtl',\n",
       "        'texture_url': '',\n",
       "        'shader_url': ''}],\n",
       "      'children': []},\n",
       "     {'id': 'M2NaF5QR',\n",
       "      'name': 'lod2',\n",
       "      'lod': 'lod2',\n",
       "      'position': {'x': -10.0, 'y': 0, 'z': 70.0},\n",
       "      'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "      'model_3d': [{'model_url': 'lod2.obj',\n",
       "        'material_url': 'lod2.mtl',\n",
       "        'texture_url': '',\n",
       "        'shader_url': ''}],\n",
       "      'children': []},\n",
       "     {'id': '1AvJ7-w8',\n",
       "      'name': 'lod2',\n",
       "      'lod': 'lod2',\n",
       "      'position': {'x': 10.0, 'y': 0, 'z': 50.0},\n",
       "      'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "      'model_3d': [{'model_url': 'lod2.obj',\n",
       "        'material_url': 'lod2.mtl',\n",
       "        'texture_url': '',\n",
       "        'shader_url': ''}],\n",
       "      'children': []},\n",
       "     {'id': 'jEsmyM7n',\n",
       "      'name': 'lod2',\n",
       "      'lod': 'lod2',\n",
       "      'position': {'x': 10.0, 'y': 0, 'z': 70.0},\n",
       "      'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "      'model_3d': [{'model_url': 'lod2.obj',\n",
       "        'material_url': 'lod2.mtl',\n",
       "        'texture_url': '',\n",
       "        'shader_url': ''}],\n",
       "      'children': []},\n",
       "     {'id': 'p22XeaI8',\n",
       "      'name': 'lod2',\n",
       "      'lod': 'lod2',\n",
       "      'position': {'x': 30.0, 'y': 0, 'z': 50.0},\n",
       "      'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "      'model_3d': [{'model_url': 'lod2.obj',\n",
       "        'material_url': 'lod2.mtl',\n",
       "        'texture_url': '',\n",
       "        'shader_url': ''}],\n",
       "      'children': []},\n",
       "     {'id': 'VHkbeYgA',\n",
       "      'name': 'lod2',\n",
       "      'lod': 'lod2',\n",
       "      'position': {'x': 30.0, 'y': 0, 'z': 70.0},\n",
       "      'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "      'model_3d': [{'model_url': 'lod2.obj',\n",
       "        'material_url': 'lod2.mtl',\n",
       "        'texture_url': '',\n",
       "        'shader_url': ''}],\n",
       "      'children': []}]},\n",
       "   {'id': 'TAeMumU_',\n",
       "    'name': 'lod1',\n",
       "    'lod': 'lod1',\n",
       "    'position': {'x': 70.0, 'y': 0, 'z': -60.0},\n",
       "    'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "    'model_3d': [{'model_url': 'lod1.obj',\n",
       "      'material_url': 'lod1.mtl',\n",
       "      'texture_url': '',\n",
       "      'shader_url': ''}],\n",
       "    'children': [{'id': '53BdHDw7',\n",
       "      'name': 'lod2',\n",
       "      'lod': 'lod2',\n",
       "      'position': {'x': 50.0, 'y': 0, 'z': -70.0},\n",
       "      'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "      'model_3d': [{'model_url': 'lod2.obj',\n",
       "        'material_url': 'lod2.mtl',\n",
       "        'texture_url': '',\n",
       "        'shader_url': ''}],\n",
       "      'children': []},\n",
       "     {'id': 'dkMul6_v',\n",
       "      'name': 'lod2',\n",
       "      'lod': 'lod2',\n",
       "      'position': {'x': 50.0, 'y': 0, 'z': -50.0},\n",
       "      'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "      'model_3d': [{'model_url': 'lod2.obj',\n",
       "        'material_url': 'lod2.mtl',\n",
       "        'texture_url': '',\n",
       "        'shader_url': ''}],\n",
       "      'children': []},\n",
       "     {'id': '4AoahfKH',\n",
       "      'name': 'lod2',\n",
       "      'lod': 'lod2',\n",
       "      'position': {'x': 70.0, 'y': 0, 'z': -70.0},\n",
       "      'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "      'model_3d': [{'model_url': 'lod2.obj',\n",
       "        'material_url': 'lod2.mtl',\n",
       "        'texture_url': '',\n",
       "        'shader_url': ''}],\n",
       "      'children': []},\n",
       "     {'id': '1JpQWd3E',\n",
       "      'name': 'lod2',\n",
       "      'lod': 'lod2',\n",
       "      'position': {'x': 70.0, 'y': 0, 'z': -50.0},\n",
       "      'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "      'model_3d': [{'model_url': 'lod2.obj',\n",
       "        'material_url': 'lod2.mtl',\n",
       "        'texture_url': '',\n",
       "        'shader_url': ''}],\n",
       "      'children': []}]},\n",
       "   {'id': '6W4oI9rs',\n",
       "    'name': 'lod1',\n",
       "    'lod': 'lod1',\n",
       "    'position': {'x': 70.0, 'y': 0, 'z': -20.0},\n",
       "    'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "    'model_3d': [{'model_url': 'lod1.obj',\n",
       "      'material_url': 'lod1.mtl',\n",
       "      'texture_url': '',\n",
       "      'shader_url': ''}],\n",
       "    'children': [{'id': 'uooBFMQJ',\n",
       "      'name': 'lod2',\n",
       "      'lod': 'lod2',\n",
       "      'position': {'x': 50.0, 'y': 0, 'z': -30.0},\n",
       "      'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "      'model_3d': [{'model_url': 'lod2.obj',\n",
       "        'material_url': 'lod2.mtl',\n",
       "        'texture_url': '',\n",
       "        'shader_url': ''}],\n",
       "      'children': []},\n",
       "     {'id': 'ARJaNNRH',\n",
       "      'name': 'lod2',\n",
       "      'lod': 'lod2',\n",
       "      'position': {'x': 50.0, 'y': 0, 'z': -10.0},\n",
       "      'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "      'model_3d': [{'model_url': 'lod2.obj',\n",
       "        'material_url': 'lod2.mtl',\n",
       "        'texture_url': '',\n",
       "        'shader_url': ''}],\n",
       "      'children': []},\n",
       "     {'id': 'OeY47jXQ',\n",
       "      'name': 'lod2',\n",
       "      'lod': 'lod2',\n",
       "      'position': {'x': 70.0, 'y': 0, 'z': -30.0},\n",
       "      'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "      'model_3d': [{'model_url': 'lod2.obj',\n",
       "        'material_url': 'lod2.mtl',\n",
       "        'texture_url': '',\n",
       "        'shader_url': ''}],\n",
       "      'children': []},\n",
       "     {'id': 'LtirG9zn',\n",
       "      'name': 'lod2',\n",
       "      'lod': 'lod2',\n",
       "      'position': {'x': 70.0, 'y': 0, 'z': -10.0},\n",
       "      'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "      'model_3d': [{'model_url': 'lod2.obj',\n",
       "        'material_url': 'lod2.mtl',\n",
       "        'texture_url': '',\n",
       "        'shader_url': ''}],\n",
       "      'children': []}]},\n",
       "   {'id': 'AsDpUpr8',\n",
       "    'name': 'lod1',\n",
       "    'lod': 'lod1',\n",
       "    'position': {'x': 70.0, 'y': 0, 'z': 20.0},\n",
       "    'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "    'model_3d': [{'model_url': 'lod1.obj',\n",
       "      'material_url': 'lod1.mtl',\n",
       "      'texture_url': '',\n",
       "      'shader_url': ''}],\n",
       "    'children': [{'id': 'JUo-FrNL',\n",
       "      'name': 'lod2',\n",
       "      'lod': 'lod2',\n",
       "      'position': {'x': 50.0, 'y': 0, 'z': 10.0},\n",
       "      'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "      'model_3d': [{'model_url': 'lod2.obj',\n",
       "        'material_url': 'lod2.mtl',\n",
       "        'texture_url': '',\n",
       "        'shader_url': ''}],\n",
       "      'children': []},\n",
       "     {'id': 'VeY9I2Bo',\n",
       "      'name': 'lod2',\n",
       "      'lod': 'lod2',\n",
       "      'position': {'x': 50.0, 'y': 0, 'z': 30.0},\n",
       "      'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "      'model_3d': [{'model_url': 'lod2.obj',\n",
       "        'material_url': 'lod2.mtl',\n",
       "        'texture_url': '',\n",
       "        'shader_url': ''}],\n",
       "      'children': []},\n",
       "     {'id': '-0TfBsdp',\n",
       "      'name': 'lod2',\n",
       "      'lod': 'lod2',\n",
       "      'position': {'x': 70.0, 'y': 0, 'z': 10.0},\n",
       "      'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "      'model_3d': [{'model_url': 'lod2.obj',\n",
       "        'material_url': 'lod2.mtl',\n",
       "        'texture_url': '',\n",
       "        'shader_url': ''}],\n",
       "      'children': []},\n",
       "     {'id': 'EA9dEb5x',\n",
       "      'name': 'lod2',\n",
       "      'lod': 'lod2',\n",
       "      'position': {'x': 70.0, 'y': 0, 'z': 30.0},\n",
       "      'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "      'model_3d': [{'model_url': 'lod2.obj',\n",
       "        'material_url': 'lod2.mtl',\n",
       "        'texture_url': '',\n",
       "        'shader_url': ''}],\n",
       "      'children': []}]},\n",
       "   {'id': 'BLDO2-QN',\n",
       "    'name': 'lod1',\n",
       "    'lod': 'lod1',\n",
       "    'position': {'x': 70.0, 'y': 0, 'z': 60.0},\n",
       "    'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "    'model_3d': [{'model_url': 'lod1.obj',\n",
       "      'material_url': 'lod1.mtl',\n",
       "      'texture_url': '',\n",
       "      'shader_url': ''}],\n",
       "    'children': [{'id': 'TnSxb0Hh',\n",
       "      'name': 'lod2',\n",
       "      'lod': 'lod2',\n",
       "      'position': {'x': 50.0, 'y': 0, 'z': 50.0},\n",
       "      'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "      'model_3d': [{'model_url': 'lod2.obj',\n",
       "        'material_url': 'lod2.mtl',\n",
       "        'texture_url': '',\n",
       "        'shader_url': ''}],\n",
       "      'children': []},\n",
       "     {'id': 'ViKrUvg4',\n",
       "      'name': 'lod2',\n",
       "      'lod': 'lod2',\n",
       "      'position': {'x': 50.0, 'y': 0, 'z': 70.0},\n",
       "      'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "      'model_3d': [{'model_url': 'lod2.obj',\n",
       "        'material_url': 'lod2.mtl',\n",
       "        'texture_url': '',\n",
       "        'shader_url': ''}],\n",
       "      'children': []},\n",
       "     {'id': '2N9zWvCw',\n",
       "      'name': 'lod2',\n",
       "      'lod': 'lod2',\n",
       "      'position': {'x': 70.0, 'y': 0, 'z': 50.0},\n",
       "      'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "      'model_3d': [{'model_url': 'lod2.obj',\n",
       "        'material_url': 'lod2.mtl',\n",
       "        'texture_url': '',\n",
       "        'shader_url': ''}],\n",
       "      'children': []},\n",
       "     {'id': 'MOtOQz93',\n",
       "      'name': 'lod2',\n",
       "      'lod': 'lod2',\n",
       "      'position': {'x': 70.0, 'y': 0, 'z': 70.0},\n",
       "      'rotation': {'x': 0, 'y': 0, 'z': 0},\n",
       "      'model_3d': [{'model_url': 'lod2.obj',\n",
       "        'material_url': 'lod2.mtl',\n",
       "        'texture_url': '',\n",
       "        'shader_url': ''}],\n",
       "      'children': []}]}],\n",
       "  'default_background': {'color': '#c2d2eb',\n",
       "   'colorAlpha': 1,\n",
       "   'ambientLight': '0xdddddd',\n",
       "   'sunlight': {'color': '0xdddddd',\n",
       "    'denity': 0.8,\n",
       "    'direction': {'x': 1, 'y': 1, 'z': 2},\n",
       "    'position': {'x': 1000, 'y': 1000, 'z': 1000}},\n",
       "   'weather': 'sunny',\n",
       "   'shadow': 'true'}}}"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import http.server\n",
    "import socketserver\n",
    "import json\n",
    "import cv2\n",
    "import random\n",
    "import math\n",
    "import numpy as np\n",
    "import os\n",
    "from nanoid import generate\n",
    "# 当底层模型在宽为10，长为10，长宽间隙为10的时候，地图的数据\n",
    "gapDistance = 10\n",
    "\n",
    "def generate_test_lod_data(layersNumber, contain_x, contain_y, size_x, size_y, block_width, block_height):\n",
    "        # 构建lod\n",
    "        lod0_data = {\n",
    "            \"scene\": {\n",
    "                \"name\": \"scene1\",\n",
    "                \"lodsetting\": {\n",
    "                                \"lod1\": {\n",
    "                                    \"distance\": 1000,\n",
    "                                    \"name\": \"building\"\n",
    "                                },\n",
    "                                \"lod2\": {\n",
    "                                    \"distance\": 900,\n",
    "                                    \"name\": \"building\"\n",
    "                                },\n",
    "                                \"lod3\": {\n",
    "                                    \"distance\": 800,\n",
    "                                    \"name\": \"building\"\n",
    "                                }\n",
    "                },\n",
    "                \"default_camera\": [\n",
    "                    {\n",
    "                        \"id\": \"01\",\n",
    "                        \"view_direction\": {\n",
    "                            \"x\": 0,\n",
    "                            \"y\": 0,\n",
    "                            \"z\": 0\n",
    "                        },\n",
    "                        \"position\": {\n",
    "                            \"x\": 277,\n",
    "                            \"y\": 449,\n",
    "                            \"z\": 835\n",
    "                        },\n",
    "                        \"pov\": 55,\n",
    "                        \"depth\": 50000\n",
    "                    }\n",
    "                ],\n",
    "                \"children\": [],\n",
    "                \"default_background\": {\n",
    "                    \"color\": \"#c2d2eb\",\n",
    "                    \"colorAlpha\": 1,\n",
    "                    \"ambientLight\": \"0xdddddd\",\n",
    "                    \"sunlight\": {\n",
    "                        \"color\": \"0xdddddd\",\n",
    "                        \"denity\": 0.8,\n",
    "                        \"direction\": {\n",
    "                            \"x\": 1,\n",
    "                            \"y\": 1,\n",
    "                            \"z\": 2\n",
    "                        },\n",
    "                        \"position\": {\n",
    "                            \"x\": 1000,\n",
    "                            \"y\": 1000,\n",
    "                            \"z\": 1000\n",
    "                        }\n",
    "                    },\n",
    "                    \"weather\": \"sunny\",\n",
    "                    \"shadow\": \"true\"\n",
    "                }\n",
    "            }\n",
    "        }\n",
    "\n",
    "        #暂存数组\n",
    "        global tempArray\n",
    "        #记录层数\n",
    "        layersNumber=layersNumber+1\n",
    "        layersNumberRecord=layersNumber\n",
    "\n",
    "        while layersNumber:\n",
    "            #判断是否为最底层\n",
    "            if layersNumber == layersNumberRecord:\n",
    "                move_x=0\n",
    "                move_y=0\n",
    "                size_x=size_x\n",
    "                size_y=size_y\n",
    "                new_width=block_width\n",
    "                new_height=block_height\n",
    "            elif layersNumber < layersNumberRecord:\n",
    "            # 计算x方向平移值\n",
    "                move_x = (contain_x-size_x % contain_x)% contain_x\n",
    "                # x方向数量\n",
    "                size_x = math.ceil(size_x/contain_x)\n",
    "                # 计算y方向平移值\n",
    "                move_y = (contain_y-size_y % contain_y)% contain_y\n",
    "                # y方向数量\n",
    "                size_y = math.ceil(size_y/contain_y)\n",
    "                # 计算x方向长度\n",
    "                new_width = contain_x*block_width+gapDistance*(contain_x-1)\n",
    "                # 计算y方向长度\n",
    "                new_height = contain_y*block_height+gapDistance*(contain_y-1)\n",
    "\n",
    "            #创建对应的模型文件\n",
    "            json_data_example = {\n",
    "                \"buildingArray\": [\n",
    "                    {\n",
    "                        \"name\": f\"lod{layersNumber}\",\n",
    "                        \"points\": [\n",
    "                            {\"lon\": -new_width/2, \"lat\": -new_height/2, \"height\": 3},\n",
    "                            {\"lon\": -new_width/2, \"lat\": new_height/2, \"height\": 3},\n",
    "                            {\"lon\": new_width/2, \"lat\": new_height/2, \"height\": 3},\n",
    "                            {\"lon\": new_width/2, \"lat\": -new_height/2, \"height\": 3}\n",
    "                        ],\n",
    "                        \"pointsOrder\": \"order\",\n",
    "                        \"center\": {\"lon\": 0, \"lat\": 0}\n",
    "                    }\n",
    "                ]\n",
    "            }\n",
    "\n",
    "            read_data(json_data_example)\n",
    "\n",
    "\n",
    "            #创建二维数组\n",
    "            two_d_array = np.zeros((size_x, size_y), dtype=object)\n",
    "            # 计算中心点\n",
    "            print(move_x)\n",
    "            print(move_y)\n",
    "            print(size_x)\n",
    "            print(size_y)\n",
    "            print(new_width)\n",
    "            print(new_height)\n",
    "            centers,matrix_positions= calculate_block_centers(size_x, size_y, new_width, new_height, move_x*(block_width+gapDistance)/2, move_y*(block_height+gapDistance)/2,True)\n",
    "            #添加至lod0的孩子\n",
    "            for center, matrix_position in zip(centers, matrix_positions):\n",
    "                center_x, center_y = center\n",
    "                matrix_x, matrix_y = matrix_position\n",
    "                data = {\n",
    "                    \"id\": generate(size=8),\n",
    "                    \"name\": f\"lod{layersNumber}\",\n",
    "                    \"lod\": f\"lod{layersNumber}\",\n",
    "                    \"position\": {\"x\": center_x, \"y\": 0, \"z\": center_y},\n",
    "                    \"rotation\": {\"x\": 0, \"y\": 0, \"z\": 0},\n",
    "                    \"model_3d\": [\n",
    "                        {\n",
    "                            \"model_url\": f\"lod{layersNumber}.obj\",\n",
    "                            \"material_url\": f\"lod{layersNumber}.mtl\",\n",
    "                            \"texture_url\": \"\",\n",
    "                            \"shader_url\": \"\"\n",
    "                        }\n",
    "                    ],\n",
    "                    \"children\": []\n",
    "                }\n",
    "                #检查是否为最底层，最底层无需添加孩子\n",
    "                if layersNumber < layersNumberRecord :\n",
    "                    #获取子层级的左下角初始点\n",
    "                    first_child_x=matrix_x*contain_x\n",
    "                    first_child_y=matrix_y*contain_y\n",
    "\n",
    "                    #从初始点开始放入children\n",
    "                    for i in range(contain_x):\n",
    "                        for j in range(contain_y):\n",
    "                            try:\n",
    "                                data[\"children\"].append(tempArray[first_child_x+i, first_child_y+j])\n",
    "                            except IndexError as e:\n",
    "                                print(f\"发生错误: {e}\")\n",
    "                            \n",
    "\n",
    "                two_d_array[matrix_x,matrix_y]=data\n",
    "            \n",
    "            block_width=new_width\n",
    "            block_height=new_height\n",
    "\n",
    "\n",
    "            layersNumber = layersNumber-1\n",
    "            tempArray=two_d_array\n",
    "            # print('矩阵打印')\n",
    "            # print(two_d_array)\n",
    "        \n",
    "\n",
    "        #把结果存入lod0_data\n",
    "        lod0_data[\"scene\"][\"children\"]=json.loads(json.dumps(tempArray.flatten().tolist()\n",
    ") )\n",
    "        # 将lod0数据保存为json文件\n",
    "        with open(\"testData2.json\", \"w\") as f:\n",
    "            json.dump(lod0_data, f, indent=4)\n",
    "        print(\"生成的JSON文件已保存为testData2.json\")\n",
    "        return lod0_data\n",
    "        \n",
    "def calculate_block_centers(a, b, block_width, block_height, x_correction=0, y_correction=0, matrix_coordinates=False):\n",
    "    distance = 10\n",
    "\n",
    "    # 计算中心点的坐标和方阵位置\n",
    "    centers = []\n",
    "    matrix_positions = []\n",
    "    for i in range(a):\n",
    "        for j in range(b):\n",
    "            x = (i - (a - 1) / 2) * (block_width + distance) + x_correction\n",
    "            y = (j - (b - 1) / 2) * (block_height + distance) + y_correction\n",
    "            matrix_positions.append((i, j))  # 使用阵列坐标表示方块位置\n",
    "            centers.append((x, y))  # 使用常规坐标表示方块中心点\n",
    "\n",
    "    return centers, matrix_positions\n",
    "\n",
    "def point_cross_triangle_border(p0, p1, p2):\n",
    "    # 判断p0为起始点，y轴向下方向的射线，是否与p1，p2线段相交\n",
    "    cross_point_count = 0\n",
    "\n",
    "    if p1['lon'] < p2['lon']:\n",
    "        min_lon, max_lon = p1['lon'], p2['lon']\n",
    "    else:\n",
    "        min_lon, max_lon = p2['lon'], p1['lon']\n",
    "\n",
    "    if p0['lon'] >= min_lon and p0['lon'] <= max_lon:\n",
    "        # p0的x在p1和p2之间才有意义\n",
    "        # 判断p1，p2的x是否一样\n",
    "        if p1['lon'] == p2['lon']:\n",
    "            # p1p2是一条垂直线\n",
    "            # 不用检查p0是否在p1p2上\n",
    "            cross_point_count += 0\n",
    "        else:\n",
    "            # p1p2不是垂直线，找到p1p2的方程式\n",
    "            k = (p2['lat'] - p1['lat']) / (p2['lon'] - p1['lon'])\n",
    "            b = p2['lat'] - k * p2['lon']\n",
    "            crosspoint_y = p0['lon'] * k + b\n",
    "            if p0['lat'] > crosspoint_y:\n",
    "                cross_point_count += 1\n",
    "\n",
    "    return cross_point_count\n",
    "\n",
    "\n",
    "def check_point(i, p2, points):\n",
    "    p1 = None\n",
    "    p3 = None\n",
    "    length = len(points)\n",
    "    \n",
    "    if i == 1:\n",
    "        p1 = points[length - 1]\n",
    "        p3 = points[i]\n",
    "    elif i == length:\n",
    "        p1 = points[i - 2]\n",
    "        p3 = points[0]\n",
    "    else:\n",
    "        p1 = points[i - 2]\n",
    "        p3 = points[i]\n",
    "\n",
    "    v1 = {\n",
    "        'x': p2['lon'] - p1['lon'],\n",
    "        'y': p2['lat'] - p1['lat'],\n",
    "        'z': 0\n",
    "    }\n",
    "    v2 = {\n",
    "        'x': p3['lon'] - p2['lon'],\n",
    "        'y': p3['lat'] - p2['lat'],\n",
    "        'z': 0\n",
    "    }\n",
    "\n",
    "    z = v1['x'] * v2['y'] - v1['y'] * v2['x']\n",
    "\n",
    "    if z < 0:\n",
    "        return True\n",
    "    elif z == 0:\n",
    "        return True\n",
    "    else:\n",
    "        return False\n",
    "\n",
    "def is_point_inside_triangle(p0, p1, p2, p3):\n",
    "    def sign(p1, p2, p3):\n",
    "        return (p1[\"x\"] - p3[\"x\"]) * (p2[\"y\"] - p3[\"y\"]) - (p2[\"x\"] - p3[\"x\"]) * (p1[\"y\"] - p3[\"y\"])\n",
    "\n",
    "    d1 = sign(p0, p1, p2)\n",
    "    d2 = sign(p0, p2, p3)\n",
    "    d3 = sign(p0, p3, p1)\n",
    "\n",
    "    has_neg = (d1 < 0) or (d2 < 0) or (d3 < 0)\n",
    "    has_pos = (d1 > 0) or (d2 > 0) or (d3 > 0)\n",
    "\n",
    "    return not (has_neg and has_pos)\n",
    "\n",
    "def cut_polygon(points):\n",
    "    # 会多次调用的图形切割方法\n",
    "    # points为导入的点\n",
    "    # 先判断这个图形是不是凸多边形\n",
    "    is_convex = True\n",
    "    convex_points = []  # 凸点数组\n",
    "    for i in range(1, len(points) + 1):\n",
    "        p2 = points[i - 1]\n",
    "\n",
    "        if not check_point(i, p2, points):\n",
    "            is_convex = False\n",
    "        else:\n",
    "            convex_points.append(i)\n",
    "\n",
    "    result = {\n",
    "        'convex': [],\n",
    "        'triangles': []\n",
    "    }\n",
    "\n",
    "    if is_convex:\n",
    "        # 是凸多边形，返回自身的点\n",
    "        result['convex'] = points\n",
    "        # print(\"是凸多边形\")\n",
    "        return result\n",
    "    else:\n",
    "        # -----------------------\n",
    "        # 是凹多边形，要递归切割\n",
    "        # print(\"是凹多边形\")\n",
    "        # -----------------------\n",
    "        # 遍历凸点，找到一个能切割的点\n",
    "        for point in convex_points:\n",
    "            p1 = None\n",
    "            p2 = None\n",
    "            p3 = None\n",
    "            length = len(points)\n",
    "            p1_pos = -1  # 当前凸点及其两旁的点，在图形中的位置\n",
    "            p2_pos = -1\n",
    "            p3_pos = -1\n",
    "            if point == 1:\n",
    "                p1 = points[length - 1]\n",
    "                p2 = points[0]\n",
    "                p3 = points[1]\n",
    "                p1_pos = length - 1\n",
    "                p2_pos = 0\n",
    "                p3_pos = 1\n",
    "            elif point == length:\n",
    "                p1 = points[length - 2]\n",
    "                p2 = points[length - 1]\n",
    "                p3 = points[0]\n",
    "                p1_pos = length - 2\n",
    "                p2_pos = length - 1\n",
    "                p3_pos = 0\n",
    "            else:\n",
    "                p1 = points[point - 2]\n",
    "                p2 = points[point - 1]\n",
    "                p3 = points[point]\n",
    "                p1_pos = point - 2\n",
    "                p2_pos = point - 1\n",
    "                p3_pos = point\n",
    "\n",
    "            # 遍历points中除去p1、p2、p3的点，是否在p1p2p3的三角形内\n",
    "            conflict = False\n",
    "            for j in range(length):\n",
    "                if j != p1_pos and j != p2_pos and j != p3_pos:\n",
    "                    # 遍历到非p1p2p3的点的时候\n",
    "                    # 把这个点从points中拿出来，检测在不在p1p2p3的三角形内\n",
    "                    if is_point_inside_triangle(points[j], p1, p2, p3):\n",
    "                        conflict = True\n",
    "\n",
    "            # 遍历结束，查看冲突值，如果为true，则发生冲突，该点不能切割\n",
    "            if conflict:\n",
    "                print(p2, \" 不是可划分点\")\n",
    "            else:\n",
    "                print(p2, \" 是可划分点\")\n",
    "                # 开始划分\n",
    "                # 切割三角形出来\n",
    "                tri_list = {\n",
    "                    'p1': p1,\n",
    "                    'p2': p2,\n",
    "                    'p3': p3\n",
    "                }\n",
    "                # 切割新的多边形出来\n",
    "                new_points = points.copy()\n",
    "                new_points.pop(p2_pos)\n",
    "                result2 = cut_polygon(new_points)\n",
    "                result['convex'] = result2['convex']\n",
    "                result['triangles'] = result2['triangles'].copy()\n",
    "                result['triangles'].append(tri_list)\n",
    "                # 停止循环\n",
    "                break\n",
    "\n",
    "        return result\n",
    "\n",
    "def find_pos(substring, vcontent):\n",
    "    # 找到点的原地点的部分\n",
    "    v_arr = vcontent.split('\\nv ')\n",
    "    for i, v_item in enumerate(v_arr):\n",
    "        if substring == v_item:\n",
    "            return i\n",
    "    return -1\n",
    "\n",
    "def read_data(json_data):\n",
    "    for info in json_data['buildingArray']:\n",
    "        # 创建obj文件\n",
    "        title_content = f\"mtllib {info['name']}.mtl\\no {info['name']}\"\n",
    "        points = info['points']\n",
    "        points_length = len(points)\n",
    "\n",
    "        if info['pointsOrder'] == \"reverse\":\n",
    "            # 逆时针排序，改为顺时针\n",
    "            points.reverse()\n",
    "\n",
    "        # v点\n",
    "        v_content = \"\"\n",
    "        # 获取基准点\n",
    "        basic_point = info['center'] if 'center' in info else {'lon': points[0]['lon'], 'lat': points[0]['lat']}\n",
    "        for point in points:\n",
    "            new_lon = point['lon'] - basic_point['lon']\n",
    "            new_lat = point['lat'] - basic_point['lat']\n",
    "            v_content += f\"\\nv {new_lon} {point['height']} {new_lat}\"\n",
    "        for point in points:\n",
    "            new_lon = point['lon'] - basic_point['lon']\n",
    "            new_lat = point['lat'] - basic_point['lat']\n",
    "            point['lon'] = new_lon\n",
    "            point['lat'] = new_lat\n",
    "            v_content += f\"\\nv {new_lon} 0 {new_lat}\"\n",
    "\n",
    "        # 贴图\n",
    "        vt_content = \"\\nvt 0.625000 0.500000\"\n",
    "        # 法向量\n",
    "        vn_content = \"\\nvn 0 1 0\\nvn 0 -1 0\"\n",
    "        # 侧面\n",
    "        for i in range(1, points_length + 1):\n",
    "            point1 = points[i - 1]\n",
    "            point2 = points[i - 1]\n",
    "            point3 = points[i] if i < points_length else points[0]\n",
    "            a = (0 - point1['height']) * (point3['lat'] - point1['lat']) - (0 - point1['height']) * (\n",
    "                    point2['lat'] - point1['lat'])\n",
    "            b = 0\n",
    "            c = (point2['lon'] - point1['lon']) * (0 - point1['height']) - (\n",
    "                    point3['lon'] - point1['lon']) * (0 - point1['height'])\n",
    "            vn_content += f\"\\nvn {a} {b} {c}\"\n",
    "\n",
    "        # 生成面组\n",
    "        face_content = \"\\ng box_Cube\\nusemtl Material01\\ns off\"\n",
    "        # 生成侧面\n",
    "        side_face_content = \"\"\n",
    "        for i in range(1, points_length + 1):\n",
    "            side_face_content += \"\\nf \"\n",
    "            if i < points_length:\n",
    "                side_face_content += f\"{i}/1/{i + 2} {i + points_length}/1/{i + 2} {i + points_length + 1}/1/{i + 2} {i + 1}/1/{i + 2}\"\n",
    "            else:\n",
    "                side_face_content += f\"{i}/1/{i + 2} {i + points_length}/1/{i + 2} {1 + points_length}/1/{i + 2} 1/1/{i + 2}\"\n",
    "\n",
    "        # 生成顶面和底面（new！！）\n",
    "        # 顶面\n",
    "        top_face_content = \"\"\n",
    "        # 底面\n",
    "        bottom_face_content = \"\"\n",
    "\n",
    "        # 获取切割结果\n",
    "        cut_face = cut_polygon(points)\n",
    "        # print(cut_face)\n",
    "        # 这里还有点问题，要改\n",
    "        # 已经处理了\\nf 出现的问题\n",
    "        # 生成切割后的凸多边形\n",
    "        success_convex = False\n",
    "        convex = cut_face['convex']\n",
    "        for point in convex:\n",
    "            substring = f\"{point['lon']} {point['height']} {point['lat']}\"\n",
    "            num = find_pos(substring, v_content)\n",
    "            if num != -1:\n",
    "                top_face_content += f\"{num}/1/1 \"\n",
    "                bottom_face_content = f\"{num + points_length}/1/2 {bottom_face_content}\"\n",
    "                success_convex = True\n",
    "            else:\n",
    "                print(\"构造凸多边形的时候，出现了不存在的点\")\n",
    "\n",
    "        if success_convex:\n",
    "            top_face_content = f\"\\nf {top_face_content}\"\n",
    "            bottom_face_content = f\"\\nf {bottom_face_content}\"\n",
    "\n",
    "        # 生成切割后的多个三角形\n",
    "        triangles = cut_face['triangles']\n",
    "        for tri in triangles:\n",
    "            top_face_content += \"\\nf \"\n",
    "            for point in tri.values():\n",
    "                substring = f\"{point['lon']} {point['height']} {point['lat']}\"\n",
    "                num = find_pos(substring, v_content)\n",
    "                if num != -1:\n",
    "                    top_face_content += f\"{num}/1/1 \"\n",
    "                    bottom_face_content = f\"{num + points_length}/1/2 {bottom_face_content}\"\n",
    "                else:\n",
    "                    print(\"构造三角形的时候，出现了不存在的点\")\n",
    "            bottom_face_content = f\"\\nf {bottom_face_content}\"\n",
    "\n",
    "        # 这里top_face_content和bottom_face_content添加\"\\n f\"的方式不同是因为顶面和底面的点顺序不同\n",
    "        # print('top_face_content',top_face_content);\n",
    "        # print('bottom_face_content',bottom_face_content);\n",
    "        # print('side_face_content',bottom_face_content)\n",
    "\n",
    "        # obj文件统合\n",
    "        obj_content = f\"{title_content}{v_content}{vt_content}{vn_content}{face_content}{top_face_content}{bottom_face_content}{side_face_content}\"\n",
    "        # 创建mtl文件\n",
    "        mtl_content = \"newmtl Material01\\nNs 50\\nKa 1 1 1\\nKd 0.800000 0.269435 0.285941\\nKs 0.664835 0.664835 0.664835\\nKe 0 0 0\\nNi 1.450000\\nd 1.000000\\nillum 2\"\n",
    "\n",
    "        # Python的文件生成方式\n",
    "        folder_name = \"testModel\"\n",
    "        # 确保文件夹存在，如果不存在则创建\n",
    "        if not os.path.exists(folder_name):\n",
    "            os.makedirs(folder_name)\n",
    "\n",
    "        # 保存 obj 文件到 testModel 文件夹下\n",
    "        obj_file_path = os.path.join(folder_name, f\"{info['name']}.obj\")\n",
    "        with open(obj_file_path, \"w\") as obj_file:\n",
    "            obj_file.write(obj_content)\n",
    "        mtl_file_path = os.path.join(folder_name, f\"{info['name']}.mtl\")\n",
    "        with open(mtl_file_path, \"w\") as mtl_file:\n",
    "            mtl_file.write(mtl_content)\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "#generate_test_lod_data(2, 3, 2, 4, 4, 10, 10)\n",
    "\n",
    "generate_test_lod_data(1, 3, 2, 8, 8, 10, 10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Deleted file: testModel\\lod1.mtl\n",
      "Deleted file: testModel\\lod1.obj\n",
      "Deleted file: testModel\\lod2.mtl\n",
      "Deleted file: testModel\\lod2.obj\n",
      "Deleted file: testModel\\lod3.mtl\n",
      "Deleted file: testModel\\lod3.obj\n"
     ]
    }
   ],
   "source": [
    "import os\n",
    "\n",
    "def delete_files_in_folder(folder_path):\n",
    "    # 获取文件夹下所有文件\n",
    "    file_list = os.listdir(folder_path)\n",
    "\n",
    "    # 遍历文件夹下的所有文件\n",
    "    for file_name in file_list:\n",
    "        file_path = os.path.join(folder_path, file_name)\n",
    "\n",
    "        # 判断是否是文件，并且是 obj 或 mtl 文件\n",
    "        if os.path.isfile(file_path) and (file_name.endswith('.obj') or file_name.endswith('.mtl')):\n",
    "            # 删除文件\n",
    "            os.remove(file_path)\n",
    "            print(f\"Deleted file: {file_path}\")\n",
    "\n",
    "# 调用函数，传入文件夹路径\n",
    "delete_files_in_folder('testModel')\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0 0 0 0 0 0 0 0 0 0 0 0]\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "\n",
    "# 假设你的矩阵是 size_x 行，size_y 列\n",
    "size_x = 3\n",
    "size_y = 4\n",
    "\n",
    "# 创建包含 object 类型的矩阵\n",
    "matrix = np.zeros((size_x, size_y), dtype=object)\n",
    "\n",
    "# 将矩阵展平为一维数组\n",
    "flattened_array = matrix.flatten()\n",
    "\n",
    "# 打印展平后的数组\n",
    "print(flattened_array)\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3.8.8 ('base')",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.8"
  },
  "orig_nbformat": 4,
  "vscode": {
   "interpreter": {
    "hash": "e42634819b8c191a5d07eaf23810ff32516dd8d3875f28ec3e488928fbd3c187"
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
